Promise一个成功就返回,全失败返回失败

背景

项目前端js需要实现向多个ip地址请求某个接口,一但有某个接口成功就返回其结果,全部失败才为失败。

方法

一开始就想到Promise的all和race,但是都不满足,所以就自己封装了一个。(后面发现其实有Promise.any这个方法,但是可能会有兼容性问题,
Promise.any()

代码

参考了网上的Promise.all的实现方法,来实现Promise.any

Promise.all实现方式

const  all = function(promises) {
    return new Promise((resolve, reject) => {
        let arr = []
        let idx = 0 // 执行个数
        let dealProcess = (val, index) => {
            arr[index] = val
            if(++idx == promises.length) {
                resolve(arr)
            }
        }
        promises.forEach((item, i) => {
            if(isPromise(item)) {
                item.then(y => {
                    dealProcess(y, i)
                }, 
                reject)
            }else {
                dealProcess(item, i)
            }
        });
    })
}

自己封装实现any

const any = function(promises) {
      return new Promise((resolve, reject) => {
          let arr = []
          let idx = 0 // 执行个数
          let dealProcess = (val, index) => {
              arr[index] = val
              if(++idx == promises.length) {
                  reject(arr)
              }
          }
          promises.forEach((item, i) => {
              if(isPromise(item)) {
                item.then(resolve,y => {
                  dealProcess(y, i)
                })
              }else {
                  dealProcess(item, i)
              }
          });
      })
  }

测试代码

const prFull = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('FULFIL')
  }, 1000)
})

const prFull2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('FULFIL2')
  }, 100)
})

const prFull3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('FULFIL3')
  }, 1000)
})

const prFull4 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('FULFIL4')
  }, 1000)
})

const prRej = new Promise((resolve, reject) => {
  setTimeout(() => {
     reject('rejuect11')
  }, 1000)
})

const prRej2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('rejuect')
  }, 1000)
})

all([prFull3,prFull2,prRej]).then(value =>{console.log(value)
},err =>{console.log(err)}) 

any([prRej,prRej2]).then(value =>{console.log(value)
},err =>{console.log(err)}) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Promise.all进行请求时,如果其中一个请求失败了,那么其他成功的请求无法直接返回。原因是Promise.all是一种集合的方式,只有当所有的Promise对象都变为fulfilled状态时,才会返回一个包含所有成功结果的新Promise。如果其中一个Promise对象变为rejected状态,它会导致整个Promise.all变为rejected状态。 然而,可以通过对每个Promise对象进行错误处理,来实现其他成功请求的返回。可以使用catch方法来捕获每个Promise对象的错误,并返回一个符合预期的结果。以下是实现的示例代码: ```javascript const promises = [promise1, promise2, promise3]; // 假设promise1、promise2、promise3是三个异步请求的Promise对象 Promise.all(promises.map(p => p.catch(e => e))) .then(results => { const successfulResults = results.filter(r => !(r instanceof Error)); console.log(successfulResults); }) .catch(err => { console.log(err); }); ``` 在这个示例中,我们使用Array.map方法对每个Promise对象应用catch方法来捕获错误,如果发生错误,catch方法将返回一个Error对象。然后,我们通过Promise.all来等待所有Promise对象的状态变化,然后处理结果。 在最后的then块中,我们过滤掉包含错误的结果,只保留成功的结果并输出。 需要注意的是,此方法只能处理单个Promise对象的失败情况,如果是多个Promise对象同时失败,则无法返回其他成功的结果。如果需要实现更高级的错误处理,可以考虑使用其他的Promise库或异步控制流工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值