BFE.dev前端刷题 33. 实现Promise.allSettled()

时间:2022-07-25
本文章向大家介绍BFE.dev前端刷题 33. 实现Promise.allSettled(),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

bfe.dev 是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在上面的刷题日记。

题目33

BFE.dev#33 实现Promise.allSettled()

分析

和Promise.all()不同,Promise.allSettled()即使是遇到rejection也会等待所有的promise到最后。所以我们只需要用一个array记录各个promise的fulfill或者reject结果即可。

代码

首先完成基本的new Promise结构。

function allSettled(promises) {
 
  return new Promise((resolve, reject) => {
    const result = []
    
    promises.forEach((promise, index) => {
      promise.then((value) => {
        result[index] = {
          status: 'fulfilled',
          value
        }
      }, (reason) => {
        result[index] = {
          status: 'rejected',
          reason
        }
      })
    })
  })
}
复制代码

为了检测最终settle的时机,需要一个计数器。同时也注意传入的数据并不一定全部是Promise。

function allSettled(promises) {
  if (promises.length === 0) return Promise.resolve([])
  
  const _promises = promises.map(
    item => item instanceof Promise ? item : Promise.resolve(item)
    )
  
  return new Promise((resolve, reject) => {
    const result = []
    let unSettledPromiseCount = _promises.length
    
    _promises.forEach((promise, index) => {
      promise.then((value) => {
        result[index] = {
          status: 'fulfilled',
          value
        }
        
        unSettledPromiseCount -= 1
        // resolve after all are settled
        if (unSettledPromiseCount === 0) {
          resolve(result)
        }
      }, (reason) => {
        result[index] = {
          status: 'rejected',
          reason
        }
        
        unSettledPromiseCount -= 1
        // resolve after all are settled
        if (unSettledPromiseCount === 0) {
          resolve(result)
        }
      })
    })
  })
}
复制代码

通过撒花

感谢阅读,希望有所帮助。有兴趣可以自己试试