// Promise.all 方法,是一次性处理多个Promise函数,属于并发处力,接受一个Promise回调数组
Promise.All = function (PromiseArray) {
if (!Array.isArray(PromiseArray)) throw Error('请传递一个数组');
// 定义返回结果的变量
const result = [];
// 定义每次递增变量
let count = 0;
// 返回一个Promise
return new Promise((resolve, reject) => {
// 遍历传递的数据
for (let i = 0; i < PromiseArray.length; i++) {
PromiseArray[i].then(
(res) => {
// 存储成功的变量
result[i] = res;
// 更改计时器
count++;
// 判断累加器的长度以及结果数组的长度
/* 没有直接效验结果长度的原因是,Promise的响应时间可能不同,那么返回结果就有可能存在 empty 的现象 */
if (
result.length === PromiseArray.length &&
count === PromiseArray.length
) {
// 如果符合 直接 resolve 结果出去
resolve(result);
}
},
(rej) => {
reject(rej);
}
);
}
});
};
// 定义测试函数
function test(...args) {
return new Promise((res) => {
setTimeout(() => {
res(...args);
}, Math.random() * 1000);
});
}
function test2(...args) {
return new Promise((res, rej) => {
setTimeout(() => {
rej(...args);
}, Math.random() * 1000);
});
}
let p1 = test2('p1');
let p2 = test('p2');
let p3 = test('p3');
let p4 = test('p4');
Promise.All([p1, p2, p3, p4]).then(
(res) => console.log(res),
(rej) => console.log(rej) // p1
);
Promise.All([p2, p3, p4]).then(
(res) => console.log(res), // ['p2', 'p3', 'p4']
(rej) => console.log(rej)
);
JS面试题 - 手写简单实现Promise.all方法
于 2022-02-14 16:58:39 首次发布