Skip to main content

手写 Promise.all

思路:

  1. Promise.myAll 知道要在 Promise 上写而不是在原型上写

  2. 初始化

    • 数组 reulst
    • 计数器 count
  3. 返回异步 new Promise 数据

    • forEach 遍历:子项(item,index)通过 then 获取异步结果
      • 成功:
        • 存入数组 result[index] = data
        • 计数+1
        • 全部成功返回全部结果
      • 失败:立即返回第一个失败
  /**
* 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()