Javascript异步转同步篇二——Promise.all/allSettled
2024-01-08 19:30:40
Promise.all()方法
Promise.all()方法接受一个Promise数组作为参数,并返回一个新的Promise对象。当所有传入的Promise对象都成功执行后,新的Promise对象才会执行成功,其中任意一个Promise对象执行失败,新的Promise对象也会执行失败。
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3])
.then((values) => {
console.log(values); // [1, 2, 3]
})
.catch((error) => {
console.log(error); // 不执行
});
上面的代码中,三个Promise对象都成功执行,因此Promise.all()方法返回的Promise对象也会执行成功,并将三个Promise对象执行的结果作为参数传递给.then()方法的回调函数。
如果其中任意一个Promise对象执行失败,Promise.all()方法返回的Promise对象也会执行失败,并将第一个执行失败的Promise对象执行的错误信息作为参数传递给.catch()方法的回调函数。
const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('Error'));
const promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3])
.then((values) => {
console.log(values); // 不执行
})
.catch((error) => {
console.log(error.message); // Error
});
Promise.allSettled()方法
Promise.allSettled()方法与Promise.all()方法类似,但它会等到所有传入的Promise对象都执行完毕后再执行成功,无论这些Promise对象是否执行成功。
const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('Error'));
const promise3 = Promise.resolve(3);
Promise.allSettled([promise1, promise2, promise3])
.then((values) => {
console.log(values); // [{status: "fulfilled", value: 1}, {status: "rejected", reason: Error}, {status: "fulfilled", value: 3}]
})
.catch((error) => {
console.log(error); // 不执行
});
上面的代码中,三个Promise对象都执行完毕,因此Promise.allSettled()方法返回的Promise对象也会执行成功,并将三个Promise对象执行的结果作为参数传递给.then()方法的回调函数。
其中,promise2执行失败,因此它的结果对象中的status属性值为"rejected",reason属性值为错误信息;其他两个Promise对象执行成功,因此它们的结果对象中的status属性值为"fulfilled",value属性值为执行结果。
总结
Promise.all()方法和Promise.allSettled()方法都是用来处理多个Promise对象同时执行或全部执行完毕后再执行后续操作的。Promise.all()方法要求所有传入的Promise对象都执行成功,而Promise.allSettled()方法则会等到所有传入的Promise对象都执行完毕后再执行成功。