javascript - 将现有函数声明为异步?

标签 javascript ecmascript-6 async-await

我使用一个名为 setConf 的函数进行测试。有时,如果我可以使用它来启动 promise 链,这真的很方便,有时我只需要它返回值。

是否可以将现有函数声明为异步函数?我想做但不起作用的是:

const setConf = (conf) => {
  mainConf = Object.assign(mainConf , conf)
  return mainConf 
}

module.exports.asyncSetConf = async setConf
module.exports.setConf = setConf

这是我目前拥有的

exports.asyncSetConf = async (conf) => {
  mainConf = Object.assign(mainConf , conf)
  return mainConf 
}

exports.setConf = (conf) => {
  mainConf = Object.assign(mainConf , conf)
  return mainConf 
}

代码是相同的,无法重构它似乎有点愚蠢

最佳答案

首先,使用 async 关键字声明的函数会返回一个 Promise。所以你要么希望你的函数返回一个 promise ,要么你不希望。不存在使用 async 关键字声明的函数有时返回 Promise,有时不返回的情况。

其次,如果您的函数中没有异步代码,那么将同步操作包装在异步接口(interface)中通常会使事情变得更加复杂,而不是变得更加复杂,因此通常没有理由这样做。

第三,如果您只是想有时使用 setConf() 来启动 Promise 链,您可以在需要时简单地用 Promise.resolve() 包装它为此:

Promise.resolve(setConf(...)).then(f).then(g).catch(...)

当然,您也不一定需要这样做,因为如果 f() 是异步的并返回一个 Promise,您可以这样做:

f(setConfg(...)).then(g).catch(...)

如果你发现自己经常使用Promise.resolve(setConf(...)),那么你可以为其创建一个实用函数:

function setConfPromise(...args) {
    return Promise.resolve(setConf(..args))
}

Is it possible to declare an existing function as async?

您可以更改其声明,也可以用另一个函数包装它。您有时无法使用异步行为动态地实现它,有时则不能。为此,您需要两个单独的函数。

你可以这样包装它:

module.exports.asyncSetConf = function(...args) {
    return Promise.resolve(setConf(...args));
}
module.exports.setConf = setConf
<小时/>

仅供引用,async 仅应在实际需要时使用。关于其用法的一些注意事项:

  1. 当不涉及实际的异步代码时,永远不要使用async。将异步接口(interface)放在同步代码上只会使该功能的使用比所需的更加复杂。
  2. 当您想在函数内使用 await 时,请使用 async
  3. 当您强制自动返回 Promise 并自动捕获一些异常并将其转变为被拒绝的 Promise 时,请使用async

就我个人而言,当我想在函数内部使用 await 时,我只会使用 async

您不需要仅仅为了返回 promise 而使用async。您可以通过“老式”方式仅返回一个 promise 来做到这一点。

使用async不会使任何同步代码突然异步运行(常见的新手假设)。它根本不改变同步代码。它强制返回值成为一个 promise ,调用者必须使用 await.then() 来获取强制“下一个报价”的值在 .then() 上执行,但如果函数中的代码都是同步的,它仍然会同步执行 - async 不会改变这一点。

关于javascript - 将现有函数声明为异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47911388/

相关文章:

javascript - 为什么匿名函数在 Javascript 中对我不起作用?

javascript - 发送许多请求来检查 name 是否存在并设置 name 属性

javascript - 对象用 ...props 解构所有 Prop

c# - 为什么对方法的第二个参数使用 await 运算符会影响第一个参数的值?

javascript - 通过按某些特殊字符或字符序列拆分来解析 JSON 输出

javascript - 检测点击了哪个链接

javascript - ES6+/React Native 类属性 : The first one is undefined

javascript - 数据应该放在 redux 状态树中吗?

c# - 等待不调用我的方法,它永远不会返回

javascript - 如何在异步 forEach 循环中添加延迟