面试官:Promise.all有实现过吗

简介: 面试官:Promise.all有实现过吗
Promise.myAll = function (promises) {
      return new Promise((resolve, reject) => {
        const values = []
        promises.forEach((promise) => {
          promise.then(
            (res) => {
              values.push(res)
              if (values.length === promises.length) {
                resolve(values)
              }
            },
            (err) => {
              reject(err)
            }
          )
        })
      })
    }


然后面试官就发现了我面试的漏洞,然后就问我如何保证每个promise返回结果的顺序。

我说我们加入的顺序就是最后返回结果的顺序啊。他又给我举了一个promise的场景,然后我理解了他说的意思。


就是我们的promise数组,例如[p1, p2, p3]。p2执行的时间可能比p3长,那么如何确保p1, p2, p3 resolve的结果保证顺序。因为我们刚刚使用的是push方法,所以会出现问题。


然后面试官让我现场再想想。其实当时脑子一片空白。哎说真的,我自认为自己对微任务宏任务这一块还是了解的比较多的。但是我当时阙文面试官,我们在处理每一个promise.then的时候是不是按照顺序的。


其实我们可以通过循环promise数组的下标来进行添加resolve的值的。然后引入一个计算器来计算成功结果的个数。


Promise.myAll = function (promises) {
  // return new Promise((resolve, reject) => {
  //   const values = []
  //   promises.forEach(async (promise, i) => {
  //     // promise.then(
  //     //   (res) => {
  //     //     values.push(res) // 这里需要使用count去累加。
  //     //     if (values.length === promises.length) {
  //     //       resolve(values)
  //     //     }
  //     //   },
  //     //   (err) => {
  //     //     reject(err)
  //     //   }
  //     // )
  return new Promise((resolve, reject) => {
    const values = []
    let count = 0
    promises.forEach((promise, i) => {
      Promise.resolve(promise).then( // 还有就是对于传入的非promise的包裹。
        (res) => {
          count++
          // values.push(res) // 这里需要使用下标添加。
          values[i] = res
          // if (values.length === promises.length) { // 这里也不能通过数组长度判断,因为后面的promise状态改变后直接就添加到values数组中,然后长度也为promises.length。但是前面的promise还没返回值。所以需要一个变量来控制。
          //   resolve(values)
          // }
          if (count === promises.length) {
            resolve(values)
          }
        },
        (err) => {
          reject(err)
        }
      )
    })
  })
}


相关文章
|
3月前
|
存储 前端开发 算法
promise.all是怎实现的?
promise.all是怎实现的?
22 0
|
4月前
|
前端开发 JavaScript API
停止在 JavaScript 中使用 Promise.all()
停止在 JavaScript 中使用 Promise.all()
37 0
|
9月前
Promise.all和Promise.race的区别和使用
比如当数组里的P1,P2都执行完成时,页面才显示。 值得注意的是,返回的数组结果顺序不会改变,即使P2的返回要比P1的返回快,顺序依然是P1,P2 Promise.all成功返回成功数组, 失败返回失败数据,一但失败就不会继续往下走
|
10月前
|
编译器
1LL随手记(1LL是什么,1LL怎么用)
1LL随手记(1LL是什么,1LL怎么用)
161 0
|
12月前
|
前端开发 C++
【面试】‘return await promise‘ 与 ‘return promise‘ 这细微的区别,你的可能还不知道?
当从一个异步函数的promise返回时,我们可以使用return await promise等待 promise 解析完,也可以直接返回它 return promise。
|
前端开发
前端学习案例23-promise.all和promise.race
前端学习案例23-promise.all和promise.race
53 0
前端学习案例23-promise.all和promise.race
|
前端开发
前端学习案例24-promise.all和promise.race之2
前端学习案例24-promise.all和promise.race之2
60 0
前端学习案例24-promise.all和promise.race之2
|
前端开发
Promise.all()方方详解
Promise.all()方方详解
Promise.all()方方详解
|
前端开发
前端学习案例1-promise之promise.all
前端学习案例1-promise之promise.all
52 0
前端学习案例1-promise之promise.all
|
前端开发 JavaScript
Promise.all等待所有Promise执行完成
Promise.all等待所有Promise执行完成
345 0