不能从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:通过调用resolvereject来代替使用returnthrow语句]

通过“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(可能会被拒绝)。 而且这个返回值被忽略了,因为承诺正在等待被调用的结果。