【问题标题】:When should we define a function as async我们什么时候应该将函数定义为异步
【发布时间】:2015-06-02 16:25:59
【问题描述】:

这个问题让我困惑了很久,所以我决定寻求帮助,我相信没有确定的答案,可以公开讨论。

如果我的功能之一:

  1. 返回一个承诺
  2. 不需要await任何其他功能
  3. 不要自己创建promise,它只是返回另一个函数返回的promise
  4. 请勿在 Promise 上调用 thencatch,以免涉及更多异步流程

这个函数应该是async吗?

例如:

async function updateUser(user) {
    return await fetch('/some/url', {body: JSON.stringify(data)});
}

function growUp1(user) {
    user.age++;
    return updateUser(user);
}

async function growUp2(user) {
    user.age++;
    return await updateUser(user);
}

我认为growUp1 更简单,代码更简洁,babel 转换后性能更好(因为涉及的异步生成器更少),growUp2updateUser 在异步和同步之间切换时更健壮。

我们是否应该强制执行:

  1. 如果一个函数返回 Promise,它必须async
  2. 如果函数依赖于 async 函数,则它必须async

还是让团队成员免费使用?

另一个问题可能是,如果一个函数只包含一些简单的then 调用承诺,它是否应该成为一个async 函数并在所有可能的情况下使用await 来消除then 调用?

【问题讨论】:

  • 这个问题似乎只是在征求意见。我不确定它是否最适合 SO。归根结底,答案是做任何你认为最好的事情。

标签: javascript async-await ecmascript-harmony


【解决方案1】:

我不会把它设为async function。当然,正常函数返回一个承诺仍然应该被正确记录。

需要考虑的重要一点是

async function f(x) {
    return await x;
}

不完全是 identity function - 实际上是 Promise.resolve 函数。如果您等待x 承诺并返回结果,那么您不会返回x,而是实际上是一个新的承诺。这确实会产生一些开销(尽管不太可能很大)。

我们是否应该强制执行……

这取决于您的团队。如果您同意将 async 关键字作为返回 promise 的函数的标记,并且您希望对此保持一致,那么只需将其包含在您的样式指南中并遵循它。

我个人认为这不是一个好主意,你不应该教条主义。仅在适当的情况下使用async

【讨论】:

    猜你喜欢
    • 2019-01-28
    • 2012-06-28
    • 2016-10-18
    • 2021-09-07
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多