我使用一个名为 setConf 的函数进行测试。有时如果我可以用它来启动一个承诺链真的很方便,有时我只需要它来返回值。
是否可以将现有函数声明为异步函数?我想做但不起作用的是:
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。因此,您要么希望函数返回承诺,要么不返回。没有使用async
关键字声明的函数有时会返回承诺有时不会。
其次,如果您的函数中没有异步代码,那么在异步接口中包装同步操作通常会使事情变得更复杂,而不是更复杂,因此通常没有理由这样做。
第三,如果你只是想有时setConf()
用来启动一个承诺链,你可以Promise.resolve()
在你想要这样做的时候简单地用它来包装它:
Promise.resolve(setConf(...)).then(f).then(g).catch(...)
当然,您也不一定需要这样做,因为如果f()
是异步的并返回一个承诺,您可以这样做:
f(setConfg(...)).then(g).catch(...)
如果你发现自己使用Promise.resolve(setConf(...))
了很多,那么你可以为它制作一个实用函数:
function setConfPromise(...args) {
return Promise.resolve(setConf(..args))
}
是否可以将现有函数声明为异步函数?
你可以改变它的声明,或者你可以用另一个函数包装它。你不能动态地让它有时有async
行为,有时没有。为此,您需要两个单独的功能。
你可以这样包装它:
module.exports.asyncSetConf = function(...args) {
return Promise.resolve(setConf(...args));
}
module.exports.setConf = setConf
仅供参考,async
应仅在实际需要时使用。关于它的使用的一些注意事项:
async
当不涉及实际的异步代码时,您永远不应该使用。将异步接口放在同步代码上只会使函数的使用比所需的更复杂。async
想await
在函数内部使用时使用。async
时,您可以自动强制返回一个承诺,有一些例外自动捕获并变成了拒绝承诺。就个人而言,我只会async
在我想await
在函数内部使用时使用。
您不需要使用async
just 来返回承诺。您可以通过返回承诺来以“老式”方式做到这一点。
使用async
不会使任何同步代码突然异步运行(一个常见的新手假设)。它根本不改变同步代码。它强制返回值是一个承诺,调用者必须使用该承诺await
或.then()
with 来获取将强制在 上执行“下一个滴答”的值.then()
,但如果函数中的代码都是同步的,它仍将执行同步 -async
不会改变这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句