当其中一个承诺不成功时,ES6 解构的承诺失败

Promises with ES6 destructuring fails when one of the promises don't succeed

关于它的话题有很多,但我找不到这个案例。让我解释一下:

const [call1, call2, call3] = await Promise.all([promise1, promise2, promise3]);

如果他们成功了,应该 return 好吧,是吗?但如果失败了怎么办?它抛给我这个:未处理的拒绝(TypeError):(中间值)不可迭代

我可以做到 const calls = await.Promise.all(promises) 然后像 calls[0] 一样使用它,但是否可以使用其他方法?

等待将拒绝的承诺将导致函数抛出异常。你用 try-catch.

来处理
try {
  const [call1, call2, call3] = await Promise.all([promise1, promise2, promise3]);
} catch (error) {
  // Assuming the rejection value is an Error instance.
  const message = error.message
}

您必须了解 Promise.all 的工作原理。

来自docs
Promise.all() 方法将一个可迭代的 promises 作为输入,returns 一个解析为输入 promises 结果数组的 Promise。当所有输入的承诺都已解决,或者如果输入可迭代不包含任何承诺时,此返回的承诺将解决。它会在任何输入承诺拒绝或非承诺抛出错误时立即拒绝,并将拒绝第一个拒绝消息/错误。

示例:

const promise1 = Promise.resolve(1)
const promise2 = Promise.reject('dummy error')
const promise3 = Promise.resolve(3)

const promises = [promise1, promise2, promise3] 

Promise.all(promises)
  .then(values => ...)
  .catch(err => console.log(err))

Output: 'dummy error'

相反,您可以考虑 Promise.allSettled

来自docs
Promise.allSettled() 方法 returns 在所有给定的承诺都已实现或被拒绝后解析的承诺,其中每个对象都描述了每个承诺的结果。

同样的例子,但是 Promise.allSettled:

Promise.allSettled(promises)  
.then(values => console.log(values))  

Output: [
{ status: "fulfilled", value: 1 },
{ status: "rejected", value: 'dummy error' },
{ { status: "fulfilled", value: 3 }
]

你可以看看Promise.allSettled(), this returns 一个在所有给定的 promise 之后解析的 promise 已实现或已拒绝,其中包含一组对象,每个对象描述每个承诺的结果。

因此,即使有任何承诺被拒绝,allSettled 也会解决并为您提供每个承诺结果的详细信息。

浏览器兼容性在这里: allSettled compatibility

async function testAllSettled() {
    const promises = [1,2,3].map(n => new Promise((res,rej) => setTimeout(n % 2 ? res: rej, 100, n)));
    let result = await Promise.allSettled(promises);
    console.log('Promise.allSettled result:', result);
}

testAllSettled()
.as-console-wrapper { max-height: 100% !important; top: 0; }