Promise.allSettled

583 阅读1分钟

Promise.allSettled(iterable)

参数:iterable(一个可迭代的对象,例如Array,其中每个成员都是Promise)

返回值: 输入[promise1,promise2], 无论成功或失败,都会按顺序异步返回结果。

{
    status: 'fulfilled',
    value: result//返回promise的值
}

{
    status: 'rejected',
    reason: error//返回promise拒绝的值
}

此方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。

使用场景: 当有多个彼此不依赖的异步任务成功完成时,或者你总是想知道每个promise的结果时,通常使用它。 Promise.all 更适合彼此相互依赖或者在其中任何一个reject时立即结束。

实现Promise.allSettled

function allSettled(promises) {
  if(promises.length === 0){
    return Promise.resolve([])
  }
  return new Promise((resolve, reject) => {
    let result = [];//收集数组
    let num = 0; // 表示符合条件的promise状态个数变量
    const check = () =>{
      if(num === promises.length){
        resolve(result);
      }
    }
    promises.forEach((item, index)=>{
    //传入的promises不一定都是promise对象,需要借助Promise.resolve将其包装成promise
      Promise.resolve(item).then(
        res => {
          result[index] = {
            status: 'fulfilled', 
            value: res
          }
          num++
          check()
        },
        err => {
          result[index] = {
            status: 'rejected',
            reason: err
          }
          num++
          check()
        }
      )
    })
  })
}

Promise.resolve(value)方法

  • value传入promise,返回这个promise
  • value 是thenable(即带有then方法),返回的promise会“跟随”这个thenable的对象
  • value是值,返回值

手写Promise.all

function all(promises){
    if(promises.length === 0){
        Promise.resolve([])
    }
    return new Promise((resolve, reject) => { 
        let result = []
        let num = 0
        const check = () => { 
        if (num === promises.length) { 
            resolve(result) 
           } 
        } 
        promises.forEach((item, index) => { 
            Promise.resolve(item).then( 
                res => { 
                    result[index] = res
                    num++
                    check() 
                }, 
                err => { 
                    reject(err) 
                } 
            ) 
     }) 
  })
}