Javascript 是否将现有函数声明为异步?
我使用一个名为setConf的函数进行测试。有时候,如果我可以用它来启动一个承诺链,这真的很方便,有时候我只需要它来返回值 是否可以将现有函数声明为异步?我想做但不起作用的是:Javascript 是否将现有函数声明为异步?,javascript,ecmascript-6,async-await,Javascript,Ecmascript 6,Async Await,我使用一个名为setConf的函数进行测试。有时候,如果我可以用它来启动一个承诺链,这真的很方便,有时候我只需要它来返回值 是否可以将现有函数声明为异步?我想做但不起作用的是: const setConf = (conf) => { mainConf = Object.assign(mainConf , conf) return mainConf } module.exports.asyncSetConf = async setConf module.exports.setCo
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
关键字声明的函数将返回一个承诺。因此,要么希望函数返回承诺,要么不返回。没有一个函数是用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
。将异步接口放在同步代码上只会使函数的使用比所需的更复杂wait
时,请使用async
async
李>
就我个人而言,当我想在函数中使用wait
时,我只会使用async
您不需要仅使用async
来返回承诺。你可以用“老式”的方式,只需回报一个承诺
使用
async
不会使任何同步代码突然异步运行(一种常见的新手假设)。它根本不会改变同步代码。它强制返回值成为一个承诺,调用者必须使用wait
或.then()
获取该值,该值将强制执行.then()
,但如果函数中的代码都是同步的,它仍将同步执行-async
不会改变这一点。首先,使用async
关键字声明的函数返回一个承诺。因此,要么希望函数返回承诺,要么不返回。没有一个函数是用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
。将异步接口放在同步代码上只会使函数的使用比所需的更复杂wait
时,请使用async
async
李>
就我个人而言,当我想在函数中使用wait
时,我只会使用async
您不需要仅使用async
来返回承诺。你可以用“老式”的方式,只需回报一个承诺
使用
async
不会使任何同步代码突然异步运行(一种常见的新手假设)。它根本不会改变同步代码。它强制返回值成为一个承诺,调用方必须使用wait
或。然后()
获取值,从中强制对执行“下一个勾选”。然后()
,但如果函数中的代码都是同步的,它仍将同步执行-async
不会改变这一点。使同步执行异步函数的函数没有任何价值。但是,通过创建一个新的functi,您可以很好地做到这一点