如何处理 Promise.all 中抛出的错误

问题描述 投票:0回答:2

我有一段代码,其中使用 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 }
}
javascript asynchronous promise
2个回答
0
投票

您应该在 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);
  }

})();


0
投票

帖子中的代码启动超时,在全局文件级别抛出错误,而不是在承诺作业处理程序在执行时放置在

try/catch
fulfilled
rejected
处理程序代码的
finally
块内执行的代码中抛出错误看看调用它的结果是什么。

文件级别抛出的错误可以由

window.onerror
监听器监控。您也许能够检测到这一点,并用它来拒绝一个承诺,如果它有效的话,也可以由有问题的承诺提供者解决。然后使用
Promise.race
构造来查看哪一个先发生 - 在文件级别引发错误,或者
Promise.all
得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.