【问题标题】:Synchronous exceptions in async functions异步函数中的同步异常
【发布时间】:2016-09-27 10:36:53
【问题描述】:

如果async 函数同步抛出异常会怎样?

例子:

async function whatHappen () {
  throw new BombError()
  // no "await" here
}

try {
  whatHappen().catch(() => console.error('rejected'))
} catch (e) {
  console.error('thrown')
}

我在 Babel 中运行了这个示例,似乎 throw 被自动捕获并转换为被拒绝的承诺,因此该示例会将 "rejected" 记录到控制台。

但这是否反映了实际规范以及它将如何在 JavaScript 引擎中实现?我已经尝试阅读technical proposal,但该规范显然不是针对语言用户,而是针对语言实施者。

我可以依靠async 函数来始终返回一个承诺,还是在某些情况下它们可能会同步抛出异常?是否有任何情况下调用没有await 的异步函数应该包装在try/catch 块中?

【问题讨论】:

    标签: javascript async-await


    【解决方案1】:

    是的,异步函数总是返回一个 Promise。

    在您链接的技术提案中,开头有一句话说明:

    在 ES6 讨论期间,对延迟函数提出了类似的提议。这里的提议支持相同的用例,使用相似或相同的语法,但直接建立在与生成器平行的控制流结构上,并且使用返回类型的承诺,而不是定义自定义机制。

    (强调我的)

    因此,您无需将异步函数包装在 try/catch 块中,因为它不会引发同步错误。

    PS:我刚刚看到Chrome Canary and MS Edge have implemented async/await behind a flag,所以你也可以在那里测试。

    【讨论】:

    • 谢谢。从异步函数提案中链接的延迟函数稻草人实际上通过说异常总是导致被拒绝的承诺来澄清这一点。单独来看,提案的语言本身对我来说有点模棱两可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多