Promise.all、Promise.allSettled及Promise.race实现

文章详细介绍了如何在JavaScript中手动实现Promise.all、Promise.allSettled和Promise.race这三个方法。Promise.all要求所有Promise对象成功才会返回结果,而Promise.allSettled无论成功或失败都会返回状态和结果。Promise.race则是第一个完成的Promise决定最终结果。
摘要由CSDN通过智能技术生成

Promise.all、Promise.allSettled及Promise.race实现

1、Promise.all的实现

原理:Promise.all的参数为promise列表,若所有promise任务都成功则返回resolve值的列表,如果有一个promise任务失败则返回失败,且Promise.all返回一个Promise对象,实现代码如下:

//实现promise.all
Promise._all = (promises) =>{
  return new Promise((resolve,reject) => {
      let count = promises&&promises.length || 0;
      let resolves = [];
      for(let promise of promises){
        promise.then(res => {
            resolves.push(res)
            count--
            if(count === 0){
                resolve(resolves)
            }
        }).catch(err => {
            reject(err)
        })
      }
  })
}

2、Promise.allSettled实现

原理:Promise.allSettled的参数为promise列表,不管任务失败还是成功,都将返回一个数组,该数组记录任务状态及对应的value或reason,且Promise.allSettled返回一个Promise对象,实现如下:

//实现Promise.allSettled
Promise._allSettled =  (promises) => {
    const resolveFn = value => ({status:'fulfilled',value});
    const rejectFn = reason => ({status:'rejected',reason});
    return  Promise._all(
        promises instanceof Array
            ?promises.map( promise =>
                Promise.resolve(promise).then(resolveFn,rejectFn)
            )
            :[]
    )
}

3、Promise.race实现

原理:Promise.race的参数为promise数组,返回一个 promise 实例,且返回的 promise 实例的 resolve 或 reject 的回调结果要求都是最先得到的,实现如下:

//实现Promise.race
Promise._race = function(promises){
    if(!promises instanceof Array) return;
    return new Promise((resolve,reject) => {
        for( let promise of promises){
           promise.then(res => {
               resolve(res)
           }).catch(err => {
               reject(err)
           })
        }
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值