每天做个总结吧,坚持就是胜利!
/**
@date 2021-06-15
@description Promise.all()
*/
壹(序)
Promise.all方法是Promise内置的方法之一,接受一个带有iterator接口的数据结构如Array,Set等,每个值应该是Promise实例,如果不是的话,则调用Promise.resolve()方法将其转换为Promise实例;返回一个Promise,如果每个Promise实例都是fulfilled状态,则返回一个由各个Promise实例的返回值组成的数组,如果其中一个Promise实例是rejected状态,则返回这个rejected的Promise实例的返回值。
贰(代码实现)
Promise.all = function (promises) {
let res = [],
counter = 0;
return new Promise((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
const promise = promises[i];
Promise.resolve(promise)
.then((resp) => {
counter++;
res.push(resp);
if (counter === promises.length) {
return resolve(res);
}
})
.catch((reason) => {
reject(reason);
});
}
});
};
// 测试
const p1 = Promise.resolve(2);
const p2 = Promise.resolve(3);
let promises = [1, p1, p2];
Promise.all(promises)
.then((resp) => {
console.log(resp); // [1, 2, 3]
})
.catch((reason) => {
console.log(reason);
});
const p3 = Promise.resolve(3);
const p4 = Promise.reject(4);
promises = [p3, p4, 5];
Promise.all(promises)
.then((resp) => {
console.log(resp);
})
.catch((reason) => {
console.log(reason); // 4
});