手写 Promise.all
思路:
Promise.myAll 知道要在 Promise 上写而不是在原型上写
初始化
- 数组 reulst
- 计数器 count
返回异步 new Promise 数据
- forEach 遍历:子项(item,index)通过 then 获取异步结果
- 成功:
- 存入数组 result[index] = data
- 计数+1
- 全部成功返回全部结果
- 失败:立即返回第一个失败
- 成功:
- forEach 遍历:子项(item,index)通过 then 获取异步结果
/**
* Promise.all(myAll)返回值
* - 全部成功
* - 第一个失败
*/
Promise.myAll = (list) => {
// 函数结果集合
const results = []
// 函数执行计数器
let count = 0
return new Promise((resolve,reject)=>{
// 获取所有函数结果,index:
list.forEach((item,index)=>{
// 传入的item有可能为异步,必须通过then获取
item.then(data=>{
// 成功状态 +1
count += 1
results[index] = data
// 必须全部成功才合格
// 是count ++ 不是 ++count
if(count >= list.length ) {resolve(results)}
},error=>{
reject(error)
})
})
})
}
使用方法:
var p1 = Promise.resolve(1)
var p2 = Promise.resolve(2)
var p3 = Promise.reject(3)
Promise.myAll([p1, p2, p3]).then(values => {
console.log(values)
})
进一步提问:是否知道 Promise.allSettled()