异步函数中的同步异常

时间:2016-09-27 10:36:54

标签: javascript async-await

如果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块中?

1 个答案:

答案 0 :(得分:5)

是的,异步函数始终返回Promise。

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

  

在ES6讨论期间,与延期职能部门提出了类似的建议。此处的提议支持相同的用例,使用相似或相同的语法,但直接构建与生成器平行的控制流结构,使用返回类型的承诺,而不是定义自定义机制。

(强调我的)

因此,不存在需要在try/catch块中包装异步函数的情况,因为它不会抛出同步错误。

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