【发布时间】:2018-06-11 07:20:39
【问题描述】:
在 ES7 中,我们将为 JS 提供 async 和 await 关键字。对于常规功能,它看起来很有希望。但是我们如何处理异步事件中的异常呢?
例如
async badFunc()
{
throw "bad";
}
var reader = new FileReader();
reader.onload = async function ()
{
await badFunc();
}
根据我的理解,async 函数将是一个语法糖,它将在底层使用Promise 的resolve 和reject 函数。所以只有调用者使用await关键字时才会捕获异常。
在上面的示例中,await badFunc(); 行将捕获异常并重新抛出它。但由于onload 处理程序可能没有在回调中调用await,因此异常将在空虚中丢失。即使window.onerror 也无法捕捉到它。
所以我的问题是。在事件内部使用 await 的正确方法应该是什么,这样异常才不会丢失?
【问题讨论】:
-
将 await 包裹在
try ... catch块中 -
@0.sh 我们如何重新抛出它以便全局处理程序有机会做某事?
-
事件处理程序没有承诺的概念,因此将异步函数分配给事件处理程序似乎毫无意义,除非您处理其中的逻辑。即便如此,你也失去了返回 false 的能力。
-
@Steve,你是说抛出
await badFunc()引起的异常吗? -
这是 ES2017,不是 ES7。虽然现有帖子直接回答了这个问题,但它有利于控制流到promisify FileReader,而不是在其回调中处理承诺。
标签: javascript async-await ecmascript-2017