如果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
块中?
答案 0 :(得分:5)
是的,异步函数始终返回Promise。
在您链接的技术提案中,开头有句话说明:
在ES6讨论期间,与延期职能部门提出了类似的建议。此处的提议支持相同的用例,使用相似或相同的语法,但直接构建与生成器平行的控制流结构,使用返回类型的承诺,而不是定义自定义机制。
(强调我的)
因此,不存在需要在try/catch
块中包装异步函数的情况,因为它不会抛出同步错误。
PS:我刚看到Chrome Canary and MS Edge have implemented async/await behind a flag,所以你也可以在那里测试一下。