Javascript 是否将现有函数声明为异步?

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

我使用一个名为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
关键字声明的函数将返回一个承诺。因此,要么希望函数返回承诺,要么不返回。没有一个函数是用
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,您可以很好地做到这一点