星晴六 阴
最近在B站上看到个模拟面试, 里面提到了如何使用原生JS实现Promise.all
本人对Promise这块知识了解甚少,经过一定翻阅后,也只能模仿牛客们的一些经验,东施效颦的抄写了一番
代码如下:
function PromiseAll(iterable) {
// 将iterable转换为数组
iterable = Array.from(iterable); // iterable 一般为数组形式的Promise对象
return new Promise((resolve, reject) => {
const len = iterable.length;
let count = 0; // 记录已成功的操作数
const res = new Array(len); // 存放已成功的异步操作
for (let i = 0; i < len; i++) {
// 执行每一个promise
Promise.resolve(iterable[i]).then(
// resolve
valve => {
count++;
res[i] = valve;
if (count === len) {
// 所有的 Promise状态都是 fulfilled, 返回的实例才变成fulfilled状态
return resolve(res);
}
},
// Promise状态为 rejected时 直接抛出
err => {
return reject(err);
}
);
}
});
}
// 测试
console.log(
PromiseAll([
Promise.resolve(100),
123,
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('强生');
}, 1000);
}),
])
);