zoukankan      html  css  js  c++  java
  • 手撕Promise.allSettled

    最近面试被问到Promise.all怎么获取成功和失败的结果,实际上Promise.all是无法做到,但是处于提案阶段的Promise.allSettled正好可以满足这个场景。其实现原理和Peomise.all大同小异,无非是在resolve或者reject时做一个判断,判断所有的promise是否都已经处理完,处理完即可改变Promise的状态,返回结果。

    Promise.allSettled = function (promises) {
      return new Promise(resolve => {
        let count = 0;
        const length = promises.length;
        const result = [];
        promises.forEach((promise, index) => {
          Promise.resolve(promise).then(value => {
            count++
            result[index] = { status: 'fulfilled', value }
            if (count === length) {
              resolve(result)
            }
          }, reason => {
            count++
            result[index] = { status: 'rejected', reason }
            if (count === length) {
              resolve(result)
            }
          })
        })
      })
    }
    
    const p1 = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve("123")
      }, 500);
    })
    const p2 = new Promise((resolve, reject) => {
      reject("456")
    })
    const p3 = new Promise((resolve, reject) => {
      setTimeout(() => {
        reject("789")
      }, 2000);
    })
    
    Promise.allSettled([Promise.resolve('resolve'), p1, 'abc', p2, p3, Promise.reject('error')])
      .then(res => {
        console.log(res)
      })
  • 相关阅读:
    牛客练习赛51
    [HZOI 2016] 偏序(CDQ套CDQ)
    AtCoder Beginner Contest 140
    [国家集训队] 拉拉队排练
    [CF91B] Queue
    [AT3867] Digit Sum 2
    [TJOI2007] 路标设置
    [HNOI2001] 求正整数
    [十二省联考2019] 异或粽子
    [SDOI2013] 直径
  • 原文地址:https://www.cnblogs.com/zt123123/p/14142568.html
Copyright © 2011-2022 走看看