当其中一个承诺不成功时,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; }
关于它的话题有很多,但我找不到这个案例。让我解释一下:
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; }