Promise.all() 方法: (promises) => {}
-
promises: 包含了 n 个 promise 的数组
-
返回一个新的 Promise 对象,只有所有的 Promise 都成功才成功,只要有一个失败旧直接失败
-
成功的结果是所有 promise 成功结果组成的数组,失败结果是数组当中失败的 promise 的失败结果
-
如果不止一个失败,失败结果就是数组中第一个失败的 promise 的失败结果
// 是构造函数的方法,不是实例的方法,所以不要加 prototype
Promise.all = function (promises) {
// 1.返回一个 Promise 对象
return new Promise((resolve, reject) => {
// 6.声明一个变量计算成功的数量,再声明一个变量保存成功的结果
let count = 0;
let arr = [];
// 2.promises 结果都为成功的时候,返回才是成功
// 3.遍历 promises
for (let i = 0; i < promises.length; i++) {
promises[i].then(
(v) => {
// 4.如果走这一步就代表是成功的,但是不能直接 resolve(),如果resolve(),就会直接改变返回的状态为成功,但是如果其他的promise是失败的就没法改变了
// 5.所以我们需要知道全部的promise是否都是成功,且保存其成功的结果
// 7.每成功一个promise,就给count变量加1,arr变量保存结果,如果变量等于promise数组的长度了,就代表promises数组里面的promise都是成功的,就可以调用resolve()
count++;
// 这么写而不是push是为了保证在异步任务的时候保持顺序
arr[i] = v;
if (count === promises.length) {
// 8.count变量等于promises数组长度旧调用resolve,arr就是结果的集合
resolve(arr);
}
},
(r) => {
// 9.走这一步就直接失败了,直接调用 reject() 方法
reject(r);
}
);
}
});
};
示例
const p = new Promise((resolve, reject) => {
resolve("ok");
});
const p2 = Promise.resolve("success");
const p3 = Promise.resolve("oh ok");
let result = Promise.all([p, p2, p3]);
console.log(result);
const p = new Promise((resolve, reject) => {
resolve("ok");
});
const p2 = Promise.reject("no ok");
const p3 = Promise.resolve("oh ok");
let result = Promise.all([p, p2, p3]);
console.log(result);