带有 .catch() 的承诺被拒绝,但在 Promise.allSetteled 中显示为已完成

Mhm*_*z_A 2 javascript promise

这是问题的简化版本;

有一些承诺,很少的.then()链和一个.catch()用于错误处理的块;每个承诺可能会解决或拒绝,因此我Promise.allSetted曾经根据它们的数组顺序和状态来知道哪个承诺失败了;当所有承诺都解决时它工作正常,但当承诺被拒绝时,它的状态将显示为“已完成” Promise.allSetteld;如果我删除该.catch()块,它将按预期工作,但我们需要保留该.catch()块以登录到商店;那么为什么它不像预期的那样表现呢?有没有办法让它显示“被拒绝”的状态.catch()

let a = Promise.resolve("a: Promise.resolved").then(response => response).catch(err=>console.log(err));

let b = Promise.reject("b: Promise.rejected").then(response => response); // no error handling

let e = Promise.reject("e: Promise.rejected").then(response => response).catch(err=>console.log(err));

Promise.allSettled([a,b,e]).then( values => console.log(values) );
Run Code Online (Sandbox Code Playgroud)

Ful*_*Guy 5

你可以从块中抛出错误catch,这样错误就不会在catch

let a = Promise.resolve("a: Promise.resolved").then(response => response).catch(err => console.log(err));

let b = Promise.reject("b: Promise.rejected").then(response => response); // no error handling

let e = Promise.reject("e: Promise.rejected").then(response => response).catch(err => {
  console.log(err);
  throw err;
  //or Reject the Promise
  //return Promise.reject(err)
});

Promise.allSettled([a, b, e]).then(values => console.log(values));
Run Code Online (Sandbox Code Playgroud)

这也在 Mozilla文档中讨论:

p.catch(onRejected);

onRejected

一个Function在调用时Promise被拒绝。

这个函数有一个参数:reason拒绝原因。catch()如果onRejected抛出错误或返回Promise本身被拒绝的a ,则返回的 Promise被拒绝;否则,它已解决