专栏首页BFE.dev前端刷题日记BFE.dev前端刷题 33. 实现Promise.allSettled()
原创

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)
        }
      })
    })
  })
}
复制代码

通过撒花

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • BFE.dev前端刷题#32. 实现`Promise.all()`

    fulfill的data需要存在一个数组里,但是promise的fulfill时机未知,先后顺序不定,所以不能push,而是利用index来放置数据到正确的位置...

    JSer
  • BFE.dev前端刷题#55. HTML字符串中高亮关键字

    OK,现在有了上述函数,问题变得比较简单。我们只需要对于每一个index,循环调用上述函数得到最终连续区间即可。

    JSer
  • BFE.dev前端刷题 104. 按层遍历DOM树

    可以看到我们只需要不停的从左边取出元素,然后将其子元素从右边不停放入即可。这用queue实现。

    JSer
  • JQuery封装请求方法

    越陌度阡
  • MySQL 的 InnoDB 存储引擎是怎么设计的?

    对于 MySQL,要记住、或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图:

    敖丙
  • Python IO编程

    循环读取文件内容,一般读取文件内容一次读取完,内存是不够的,就要实现一次次少量数据读取

    听着music睡
  • Android自定义TextView实现文字图片居中显示的方法

    最近有个需求是这样的,人民币的符号“¥”因为安卓手机系统的不一致导致符号不是完全一样,所以用美工的给的图片代替,考虑到用的地方比较多,所以想着写一个继承于线性布...

    砸漏
  • 「干货」MySQL 的 InnoDB 存储引擎是怎么设计的?

    上一讲:MySQL 是如何实现 ACID 中的 D 的? 我用了一个问题,给大家介绍了 MySQL 中的两个成员 binlog 和 redo log。然而,这只...

    Java3y
  • [Leetcode][python]Merge Intervals/合并区间

    把起始位置(start)排序。遍历数据段,并与结果集中最后一个数据段比较能否合并,如果能合并就合并,否则加入结果集。

    后端技术漫谈
  • spring cloud和dubbo的区别

    最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论 微服务架构 。近期也看到各大技术社区开始组织一些沙龙和论坛来分享spring Clo...

    DencyCheng

扫码关注云+社区

领取腾讯云代金券