异步函数中的同步异常

Ala*_*lum 1 javascript async-await

如果async函数同步抛出异常会发生什么?

例:

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

try {
  whatHappen().catch(() => console.error('rejected'))
} catch (e) {
  console.error('thrown')
}
Run Code Online (Sandbox Code Playgroud)

我在Babel中运行了这个例子,它似乎throw被自动捕获并转换为被拒绝的promise,因此该示例将登录"rejected"到控制台.

但这是否反映了实际规范以及如何在JavaScript引擎中实现?我曾尝试阅读技术提案,但该规范显然不是针对语言用户而是针对语言实现者.

我是否可以依赖async函数来总是返回一个promise或者是否存在可能同步抛出异常的情况?有没有调用异步函数的情况await应该包含在try/ catchblock中?

nil*_*ils 5

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

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

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

(强调我的)

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

PS:我刚刚看到Chrome Canary和MS Edge在标志后面实现了异步/等待,所以你也可以在那里测试它.