我使用一个名为 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
仅应在实际需要时使用。关于其用法的一些注意事项:
- 当不涉及实际的异步代码时,永远不要使用
async
。将异步接口(interface)放在同步代码上只会使该功能的使用比所需的更加复杂。 - 当您想在函数内使用
await
时,请使用async
。 - 当您强制自动返回 Promise 并自动捕获一些异常并将其转变为被拒绝的 Promise 时,请使用
async
。
就我个人而言,当我想在函数内部使用 await
时,我只会使用 async
。
您不需要仅仅为了返回 promise 而使用async
。您可以通过“老式”方式仅返回一个 promise 来做到这一点。
使用async
不会使任何同步代码突然异步运行(常见的新手假设)。它根本不改变同步代码。它强制返回值成为一个 promise ,调用者必须使用 await
或 .then()
来获取强制“下一个报价”的值在 .then()
上执行,但如果函数中的代码都是同步的,它仍然会同步执行 - async
不会改变这一点。
关于javascript - 将现有函数声明为异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47911388/