面试复习题-手写promise.all

114 阅读2分钟

✊不积跬步,无以至千里;不积小流,无以成江海

思路

一句话简单概括就是一个计数器。

Promise.all() 是 JavaScript 中 Promise 对象的一个静态方法,它接受一个 iterable 对象作为参数,该 iterable 对象包含多个 Promise 对象。Promise.all() 方法可以用于各种场景,例如:

  • 并发执行多个异步操作
  • 等待多个异步操作完成后再执行后续操作
  • 处理多个异步操作的结果

几个要点:

  1. 要在promise上写而不是原型上面写
  2. 定义all的参数和返回值,参数是promise数组或可迭代的东西list,返回值是一个新的promise对象 new promise‘
  3. 如果结果成功,要用数组记录结果
  4. 如果结果失败,哪怕只有一个,也是整个结果都失败了,整体reject

具体思路:

  1. 定义一个promise函数为myAll。避免直接使用all造成冲突
  2. 填入输入list;输出为new promise
  3. 定义变量result记录成功的结果;定义count用来计数,表示当成功数量达到了list的长度-1则达到了终点
  4. new promise接受一个resolve和result,这两个变量决定了新的promise什么时候成功 & 什么时候失败
  5. 在new promise中遍历list,对于每个list我们有一个item(promise)和一个index(第几个promise)
  6. 然后then去等待每个变量的成功 or 失败
  7. 如果成功,把结果r(表示为index的第几个)记录在result里面【因为结果不一定按顺序呈现所以不要用map】
  8. 成功后更改计数器,并执行判断:如果list.length = count 就可以调用resolve
  9. 如果失败,则调用reject,并记录失败原因

实现

promise.myAll = function(){
    const results = []
    let count = 0
    return new Promise(
    (resolve,reject) =>{
        list.map((item, index)=> {
            item.then(result=>{
                results[index] = result
                count += 1
                if (count >= list.length) { resolve(results)}
            }, 
    (reason) => reject(reason))

}