实现Promise.all()
// 定义PromiseAll方法
const PromiseAll = (promises) => {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new Error('传入的参数不是数组'));
}
let counter = 0;
const results = [], length = promises.length;
promises.forEach(item => {
Promise.resolve(item).then(value => {
counter++;
results.push(value);
if (counter === length) {
resolve(results);
}
}).catch(err => {
reject(err);
})
})
})
}
- 生成3个promise实例
// 成功
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('p1')
}, 1000)
})
// 失败
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('p2 err'));
}, 2000)
})
// 成功
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('p3')
}, 3000)
})
- 测试PromiseAll方法
// 1、有一个promise失败
const promise1 = PromiseAll([p1, p2, p3]);
promise1.then(values => {
console.log(values)
}).catch(err => {
console.log(err)
})
输入结果:
p2失败,输出p2失败的结果
// 2、全部promise成功
const promise2 = PromiseAll([p1, p3]);
promise2.then(values => {
console.log(values)
}).catch(err => {
console.log(err)
})
输入结果:
全部promise成功,输入成功数组
// 3、传入参数不对
const promise3 = PromiseAll(p1, p3);
promise3.then(values => {
console.log(values)
}).catch(err => {
console.log(err)
})
输入结果:
PromiseAll接收的参数不是数组,报错