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

通过撒花

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