乐趣区

关于前端:BFEdev前端刷题-33-实现PromiseallSettled

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)
        }
      })
    })
  })
}

通过撒花

感激浏览,心愿有所帮忙。有趣味能够本人试试。

退出移动版