多个Promise请求,存在失败请求的情况下,获取成功请求结果

背景

在日常开发中,有时候会用到Promise.all并行发起多个请求,但是只要出现一个失败的请求,就会走入catch,导致多个请求中成功的部分也被迫失败,这可能也是设计的初衷,但是

目标

并行发送多个请求,其中失败的请求,不影响获取成功请求的结果

处理方案

1、Promise.allSettled

示例:

// 成功的请求
function ajaxSuccess () {
  return Promise.resolve([1, 2, 3])
}
// 失败的请求
function ajaxFail () {
  return Promise.reject('我失败了')
}

const promiseArr = [ajaxSuccess(), ajaxFail(), ajaxSuccess()]

Promise.allSettled(promiseArr).then(res => {
  console.log(res, 'promise.allSettled结果')
}).catch(err => {
  console.log(err)
})

运行结果:

总结:

多个promise结果,按照顺序存入数组,根据status判断接口是否成功,做出相应的逻辑处理

2、特殊处理Promise.all

示例代码:

// 成功的请求
function ajaxSuccess () {
  return Promise.resolve([1, 2, 3])
}
// 失败的请求
function ajaxFail () {
  return Promise.reject('我失败了')
}

// -------------------------------------------模拟前端API调用----------------------------------------------------

// 成功调用
const promise1 = new Promise((resolve, reject) => {
  return ajaxSuccess().then(res => {
    resolve(res)
  }).catch(err => {
    resolve(null)
    reject(err)
  })
})
const promise2 = new Promise((resolve, reject) => {
  return ajaxSuccess().then(res => {
    resolve(res)
  }).catch(err => {
    resolve(null)
  })
})
// 失败调用
const promiseFail = new Promise((resolve, reject) => {
  return ajaxFail().then(res => {
    resolve(res)
  }).catch(err => {
    resolve(null)
  })
})


const promiseArr = [promise1, promiseFail, promise2]

Promise.all(promiseArr).then(res => {
  console.log(res, 'promise.all结果')
}).catch(err => {
  console.log(err)
})

运行结果:

总结:

需要对ajax请求外层包一层Promise,针对catch内容,使用resovle对外抛出一个特殊的值,比如null,是类似allsettled的一种实现方式;

多个promise结果,按照顺序存入数组,根据自定义的内容判断接口是否成功,做出相应的逻辑处理

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们需要发起多个异步请求,并在它们都完成后进行处理时,可以使用Promise来管理这些异步操作。下面是使用Promise发起多个异步请求的一种常见方式: 1. 创建一个Promise数组,用于存储每个异步请求Promise对象。 2. 使用循环或其他方式,遍历需要发起的异步请求,并为每个请求创建一个Promise对象。 3. 在每个Promise对象中,执行相应的异步操作,并在操作完成后调用resolve方法将结果传递给Promise对象。 4. 将每个Promise对象添加到Promise数组中。 5. 使用Promise.all方法,将Promise数组作为参数传入。这将返回一个新的Promise对象,该对象将在所有异步请求都完成后进行处理。 6. 使用.then方法,对返回的Promise对象进行处理。在.then方法中,可以获取到所有异步请求的结果,并进行相应的处理操作。 下面是一个示例代码: ```javascript // 异步请求函数 function asyncRequest(url) { return new Promise((resolve, reject) => { // 执行异步操作 // 假设这里使用了axios库发送请求 axios.get(url) .then(response => { // 异步操作成功,调用resolve方法传递结果 resolve(response.data); }) .catch(error => { // 异步操作失败,调用reject方法传递错误信息 reject(error); }); }); } // 发起多个异步请求 const promiseArray = [ asyncRequest('url1'), asyncRequest('url2'), asyncRequest('url3') ]; // 处理多个异步请求的结果 Promise.all(promiseArray) .then(results => { // 所有异步请求都完成后的处理操作 console.log(results); }) .catch(error => { // 处理错误情况 console.error(error); }); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值