Promise.all当有一个请求失败时 导致所有后续的处理都停止优化方案

在您的代码中,使用 Promise.all 来处理多个异步请求(这里是获取图片URL)是一个常见且有效的方法。但是,当其中一个请求失败时,Promise.all 会立即拒绝整个Promise数组,导致所有后续的处理都停止。为了优化这一点,您可以使用 Promise.allSettled 来代替 Promise.all,这样即使某个请求失败,其他请求仍然可以继续执行,并且您可以在所有请求完成后处理每个请求的结果(无论成功还是失败)

getListAll(params).then(res => {  
  const imgPromises = res.data.data.map(item => {  
    item.checked = false;  
    // 使用 getImgUrl 返回一个Promise,并在Promise中处理成功和失败  
    return getImgUrl({ fileId: item.ossPath }).then(url => {  
      item.url = url;  
      item.status = 'success'; // 标记请求成功  
      return item;  
    }).catch(error => {  
      item.url = null; // 或者设置为错误图片URL  
      item.status = 'error'; // 标记请求失败  
      item.error = error; // 可选:保存错误信息  
      return item;  
    });  
  });  
  
  // 使用 Promise.allSettled 而不是 Promise.all  
  Promise.allSettled(imgPromises).then(results => {  
    // 过滤出所有成功的结果  
    const updatedItems = results.map(result => {  
      if (result.status === 'fulfilled') {  
        return result.value;  
      }  
      // 如果需要,可以处理失败的请求结果  
      // 这里只是简单地将其包含在返回的数组中  
      return result.reason; // 注意:这里通常不返回reason,因为reason是错误对象  
      // 更好的做法是返回带有错误信息的原item  
      return { ...result.reason, status: 'error' };  
    }).filter(item => item !== undefined); // 移除因错误而可能返回的undefined  
  
    imgList.value = updatedItems;  
    loading.value = false;  
  }).catch(error => {  
    // 处理 Promise.allSettled 外的错误(虽然这里不太可能发生)  
    console.error('Unexpected error:', error);  
    imgList.value = []; // 或者设置为错误状态  
    loading.value = false;  
  });  
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值