gpt4 book ai didi

javascript - 无法从异步 Promise 执行器函数中抛出错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:04 26 4
gpt4 key购买 nike

我一直试图从概念上理解为什么以下代码没有捕获抛出。如果您从 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”,但通过“异步”,它们并不引用 async 函数,所以我不认为他们的解释不适用于此处(如果适用,我不明白如何适用)。

如果我们使用reject而不是throw,上面的代码就可以正常工作。我想从根本上理解为什么 throw 在这里不起作用。谢谢!

最佳答案

这是 Promise constructor antipattern 的异步/等待版本!

Never ever使用异步函数作为Promise执行函数(即使你可以让它工作1)!

[1:通过调用 resolvereject 而不是使用 returnthrow 语句]

by "asynchronous" they're not referring to async functions, so I don't think their explanations apply here

他们也可以。一个简单的例子,它不能工作是

new Promise(async function() {
await delay(…);
throw new Error(…);
})

这相当于

new Promise(function() {
return delay(…).then(function() {
throw new Error(…);
});
})

现在很清楚,抛出位于异步回调内。

Promise constructor只能捕获同步异常,而异步函数从不抛出 - 它总是返回一个 promise (尽管可能会被拒绝)。并且该返回值将被忽略,因为 Promise 正在等待 resolve 被调用。

关于javascript - 无法从异步 Promise 执行器函数中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52591631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com