将现有函数声明为异步?

独行侠556

我使用一个名为 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 
}

代码是相同的,不能重构这个似乎有点傻

jfriend00

首先,用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应仅在实际需要时使用。关于它的使用的一些注意事项:

  1. async当不涉及实际的异步代码时,您永远应该使用将异步接口放在同步代码上只会使函数的使用比所需的更复杂。
  2. asyncawait在函数内部使用时使用
  3. 使用async时,您可以自动强制返回一个承诺,有一些例外自动捕获并变成了拒绝承诺。

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

您不需要使用asyncjust 来返回承诺。您可以通过返回承诺来以“老式”方式做到这一点。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么将函数参数声明为final?

如何通过反射将函数声明为类型?

为什么不将函数声明为type.CoroutineType类型的异步函数?

将函数内的大变量声明为“静态”的性能是否有所不同?

为什么将类的特殊函数显式声明为“默认”

为什么有时有时将复制构造函数声明为显式非内联的?

将函数参数类型声明为自动

将模板函数声明为非模板函数的参数

将非静态内联函数重新声明为extern

如何将参数声明为没有返回值的函数?

将函数签名中的枚举声明为返回状态

是否需要将函数声明为异步函数以返回承诺?

如何在flutter(dart)中将异步函数声明为变量?

有什么方法可以在perl中将函数声明为变量?

将非数组变量的地址传递给声明为“ Type ptr [static 1]”的函数参数是否有效?

将函数声明为指针的目的是什么?

为什么将匿名JavaScript函数声明为函数参数?

C ++:无法将函数定义与现有声明匹配

通过宏将变量声明为内联函数

如果要使用await,为什么Javascript(ES.next)会强制我将一个函数声明为异步函数?

将已删除的函数声明为noexcept有什么意义吗?

JavaScript-将函数声明为变量是否明智?

C ++:使用auto将类声明为函数内的变量

将 DLL 中的非导出函数声明为静态的原因

是否可以将具有“自动”返回类型的模板函数声明为类的朋友?

将变量声明为 ROWTYPE - 触发函数

错误:将“operator*”声明为非函数

如何将变量声明为函数并为其赋值

在调用声明为@MainActor 的异步函数的任务中使用@MainActor