【发布时间】:2017-08-22 08:40:57
【问题描述】:
我一直试图从概念上理解为什么以下代码无法捕获throw。如果您从 new Promise(async (resolve, ... 部分中删除 async 关键字,那么它可以正常工作,因此它与 Promise 执行器是一个异步函数这一事实有关。
(async function() {
try {
await fn();
} catch(e) {
console.log("CAUGHT fn error -->",e)
}
})();
function fn() {
return new Promise(async (resolve, reject) => {
// ...
throw new Error("<<fn error>>");
// ...
});
}
答案here、here 和here 重复“如果您在任何其他异步回调中,则必须使用reject”,但“异步”不是指@ 987654331@ 函数,所以我认为他们的解释不适用于这里(如果他们这样做,我不明白如何)。
如果我们使用reject 而不是throw,则上面的代码可以正常工作。我想了解,从根本上,为什么throw 在这里不起作用。谢谢!
【问题讨论】:
-
永远不要使用异步执行器函数。你为什么要这样做?
-
@Bergi 在这里肯定掉进了反模式陷阱。我看不出我会如何以不同的方式做这种事情(很可能是因为承诺新手)? --> jsbin.com/waqatagaqa/edit?js(注意
thing是一个我无法控制/没有制作的库) -
你想让
fn函数async,这样你就可以await新建的promise,然后做进一步的事情。执行者不应该是async,而应该只做一件事:等待事件发生并调用resolve/reject。您可能想用完整的代码提出一个新问题,以便我可以提供正确的答案。 -
我想我误解了你,所以我按照你的建议创建了一个单独的问题:stackoverflow.com/questions/43084557/… 谢谢你的帮助!
标签: javascript node.js promise async-await