Prmise Static Methods

看到面试题:Promise.all和Promise.any的区别的时候,我都忘了Promise.any是什么,这里记录一下

出处:Promise.any()

Promise.any

Promise.any,返回promise数组中,第一个fulfilled的promise的值

  • 如果传入空的迭代对象(空数组),就返回一个rejected的promise的值
  • 如果传入不含promise的数组,就会返回
  • 其余情况都会返回一个promise,如果数组中其中一个promise变成fulfilled,那么any返回的promise的值就是第一个变成fulfilled的promise的值
  • 如果数组的值都是rejectd,那么就返回一个rejected的promise
有fulfilled
const pErr = new Promise((resolve, reject) => {
  reject("总是失败");
});

const pSlow = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, "最终完成");
});

const pFast = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "很快完成");
});

Promise.any([pErr, pSlow, pFast]).then((value) => {
  console.log(value);
  // pFast fulfils first
})
// 期望输出:"很快完成"
全rejected
const pErr = new Promise((resolve, reject) => {
  reject("总是失败");
});
Promise.any([pErr, pErr, pErr]).then((value) => {
  console.log('then', value);
}, err => {
  console.log('err', err);
})
/**
 * [AggregateError: All promises were rejected] {
    [errors]: [ '总是失败', '总是失败', '总是失败' ]
  }
 */

Promise.all

手撕

function PromiseAll(arr) {
  return new Promise((resolve, reject) => {
    const ans = []
    const len = arr.length
    for(let i in arr) {
      Promise.resolve(arr[i]).then(res => {
        ans[i] = res
        if(ans.length === len) {
          resolve(ans)
        }
      }).catch(err => {
        reject(err)
      })
    }
  })
}

const p1 = new Promise((resolve) => {
  setTimeout(() => {
    resolve('p1')
  }, 2000);
})
const p2 = new Promise((resolve) => {
  setTimeout(() => {
    resolve('p2')
  }, 1000);
})
const p3 = new Promise((resolve) => {
  setTimeout(() => {
    resolve('p3')
  }, 3000);
})
const p4 = new Promise((resolve, reject) => {
  reject(new Error('p4'))
})

PromiseAll([p1, p2, p3, p4]).then(res => {
  console.log(res)
}).catch(err => {
  console.log(err)
})
Updated on 4/26/2023
Table of Contents