不能从asynchronous承诺执行器函数中抛出错误
我一直在试图理解为什么下面的代码没有抓住throw
。 如果new Promise(async (resolve, ...
部分中删除async
关键字new Promise(async (resolve, ...
那么它工作正常,所以它与Promise执行程序是一个asynchronous函数的事实。
(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>>"); // ... }); }
在这里 , 这里和这里的答案重复“如果你在任何其他asynchronouscallback,你必须使用reject
”,但通过“asynchronous”,他们不是指async
函数,所以我不认为他们的解释适用这里(如果他们这样做,我不知道如何)。
如果不是throw
我们使用reject
,上面的代码工作正常。 我想从根本上理解为什么throw
在这里不起作用。 谢谢!
这是Promise
构造函数反模式的asynchronous/等待版本!
永远不要使用async function
作为Promise
执行器函数(即使您可以使其工作1 ) !
[1:通过调用resolve
和reject
来代替使用return
和throw
语句]
通过“asynchronous”他们不是指
async
函数,所以我不认为他们的解释适用于此
他们也可以。 一个简单的例子,它不能工作
new Promise(async function() { await delay(…); throw new Error(…); })
相当于
new Promise(function() { return delay(…).then(function() { throw new Error(…); }); })
现在很清楚,这个throw
是在一个asynchronouscallback中。
Promise
构造函数只能捕获同步exception,并且不会抛出 async function
– 它总是返回一个promise(可能会被拒绝)。 而且这个返回值被忽略了,因为承诺正在等待被调用的结果。