
到目前为止,前几章节每个示例都是一次响应一个Promise。但是,有时,需要监控多个 Promise 的进度以确定下一步操作。JavaScript 提供了几种方法来监控多个 Promise,然后用不同的方式响应它们。本章讨论的所有方法都允许并行执行多个 Promise,然后作为一个组而不是用单独一个值响应。
Promise.all()方法
Promise.all() 方法接受单个参数,该参数是要监控的一组可迭代的promise(例如数组),返回仅当可迭代中的每个promise都resolved的promise。当可迭代对象中的每个 Promise 都实现时,返回的 Promise 就settled了,如下所示:
let promise1 = Promise.resolve(42);
let promise2 = new Promise((resolve, reject) => {
resolve(43);
});
let promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(44);
}, 100);
});
let promise4 = Promise.all([promise1, promise2, promise3]);
promise4.then(value => {
console.log(Array.isArray(value)); // true
console.log(value[0]); // 42
console.log(value[1]); // 43
console.log(value[2]); // 44
});
let promise1 = Promise.resolve(42);
let promise2 = new Promise((resolve, reject) => {
resolve(43);
});
let promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(44);
}, 100);
});
let promise4 = Promise.all([promise1, promise2, promise3]);
promise4.then(value => {
console.log(Array.isArray(value)); // true
console.log(value[0]); // 42
console.log(value[1]); // 43
console.log(value[2]); // 44
});
这里的每个promise都用一个数字来resolve。 对 Promise.all() 的调用创建了新的Promise,即Promise4,当Promise1、Promise2 和 Promise3 fulfilled,它最终fulfilled。 传递给 promise4 的实现处理程序的结果是一个包含每个解析值的数组:42,43和44。这些值按照 promise 传递给 Promise.all() 的顺序存储,因此您可以将 promise 结果与solved promise匹配。
如果任何传递给 Promise.all() 的 Promise rejected,返回的 Promise 会立即rejected,而无需等待其他 Promise完成。
let promise1 = Promise.resolve(42);
let promise2 = Promise.reject(43);
let promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(44);
}, 100);
});
let promise4 = Promise.all([promise1, promise2, promise3]);
promise4.catch(reason => {
console.log(Array.isArray(reason)); // false
console.log(reason); // 43
});
在这个例子中,第二个 promise (promise2) rejected,值为 43。promise4 的rejection handler被立即调用,而无需等待第一个 promise (promise1) 或第三个 promise(promise3) 完成执行。 (他们仍然完成执行;promise4 只是不等待。)
rejection handler总是接收单个值而不是数组,并且该值是来自rejected 的 Promise 的拒绝值。 在这种情况下,rejection handler 接收43以反映来自 promise2的rejection。
可迭代参数中的任何非promise值都将传递给 Promise.resolve() 以将其转换为promise