Promise.all() 静态方法接受一个 Promise 可迭代对象作为输入,并返回一个 Promise。当所有输入的 Promise 都被兑现时,返回的 Promise 也将被兑现(即使传入的是一个空的可迭代对象),并返回一个包含所有兑现值的数组。如果输入的任何 Promise 被拒绝,则返回的 Promise 将被拒绝,并带有第一个被拒绝的原因。添加链接描述
- 接受一个可迭代对象 最为参数
- 返回一个Promise
- 输入的每个promise状态都为fulfilled 才会变为fulfilled,有一个状态为reject直接变为reject
- 返回的兑现数组是按照输入顺序返回
开始手写
function myPromiseAll(pros) {
// 返回一个Promise
return new Promise((resolve, reject) => {
// 判断是不是可迭代对象 若不是 直接 reject
if (typeof pros[Symbol.iterator] !== 'function') {
reject('TypeError');
}
const result = []; // 保存结果
let num = 0;
let index = 0;
for (const p of pros) {
const curIndex = index;
index++;
// 保证可迭代对象中的每个item都变成Promise
Promise.resolve(p).then(
res => {
result[curIndex] = res;
num++;
if (index == num) {
// fulfilled 数量 和index 说明都完成了
resolve(result);
}
},
err => reject(err)
)
}
})
}
// 测试代码
const p1 = Promise.resolve(3);
const p2 = 1337;
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 100);
});
myPromiseAll([p1,p2,p3]).then((results) =>
results.forEach((result) => console.log(result)),
);