我有一段代码,其中使用 Promise.all 处理多个承诺,但其中一个承诺没有解决或拒绝,而是抛出错误。现在我的问题是如何处理 Promise.all 中的这个错误。
请注意,Promise 来自第 3 方模块(node_modules),因此我无法更改 Promise 内的代码,而只能处理错误。
上述问题的实现是
try {
const a = await Promise.all([
Promise.resolve(1),
func1()
// Promise.reject(4),
]);
console.log(a);
} catch (e) {
console.log("caught", e); // no error caught
}
// suppose func1 is some function exported by 3rd party package
async function func1() {
return await new Promise((rs, rj) => {
return setTimeout(() => {
throw new Error("error");
}, 1000);
});
}
尝试了很多方法
func1().catch(e => e)
func2(){
try{ func1() }catch(err){ throw err }
}
您应该在 Promise 构造函数中显式使用
reject
回调,否则您的错误将在另一个 JS 宏任务中抛出,不会影响 Promise。
鉴于异步函数正确拒绝承诺
Promise.all
按预期工作:
// suppose func1 is some function exported by 3rd party package
function func1() {
return new Promise((resolve, reject) => setTimeout(() => reject(new Error("my promise error")), 1000));
}
(async () => {
try{
await Promise.all([func1()]);
}catch(e){
console.log(e.message);
}
})();
帖子中的代码启动超时,在全局文件级别抛出错误,而不是在承诺作业处理程序在执行时放置在
try/catch
、fulfilled
或rejected
处理程序代码的finally
块内执行的代码中抛出错误看看调用它的结果是什么。
文件级别抛出的错误可以由
window.onerror
监听器监控。您也许能够检测到这一点,并用它来拒绝一个承诺,如果它有效的话,也可以由有问题的承诺提供者解决。然后使用 Promise.race
构造来查看哪一个先发生 - 在文件级别引发错误,或者 Promise.all
得到解决。