任务:手动实现一个
promise.all
第一步: 观察
promise.all
的特点:
- 入参是个由
Promise
实例组成的数组 - 返回值是个
promise
,因为可以使用.then
- 如果全部成功,状态变为
resolved
, 并且返回值组成一个数组传给回调 - 但凡有一个失败,状态变为
rejected
, 并将error
返回给回调
第二步:代码实现
function diPromiseAll(promises){
return new Promise((resolve, reject)=>{
// 参数判断
if(!Array.isArray(promises)){
throw new TypeError("promises must be an array")
}
let result = [] // 存放结果
let count = 0 // 记录有几个resolved
promises.forEach((promise, index) => {
promise.then((res)=>{
result[index] = res
count++
count === promises.length && resolve(result) // 判断是否已经完成
}, (err)=>{
reject(err)
})
})
})
}
第三步:验证
let p1 = Promise.resolve(1),
p2 = Promise.resolve(2),
p3 = Promise.resolve(3);
diPromiseAll([p1, p2, p3]).then((res)=>{
console.log(res, 'res')
}, (err)=>{
console.log(err, 'err')
})
// [1, 2, 3]
let p1 = Promise.reject(1),
p2 = Promise.resolve(2),
p3 = Promise.resolve(3);
diPromiseAll([p1, p2, p3]).then((res)=>{
console.log(res, 'res')
}, (err)=>{
console.log(err, 'err')
})
// 1 "err"