当前位置: 首页 > news >正文

Promse.all 与 Promise.allSettled

背景

多个promise需要都正确返回的时候处理逻辑,使用了promise.all

问题

但是比如多个promise中有一个抛出错误,那么整体就立即catch,不管剩余的其他promise有没有执行完

需求

多个promise 如果至少一个报错,需要都执行完毕,再catch到error,而不是catch到一个error就立即抛出来,不管其他结果

解决办法一

使用最新的API, Promise.allSettled

MDN

片段一


const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>setTimeout(reject, 100, "foo"),
);
const promises = [promise1, promise2];Promise.allSettled(promises).then((results) =>results.forEach((result) => console.log(result.status)),
);// Expected output:
// "fulfilled"
// "rejected"

片段二

Promise.allSettled(allPromises).then((results) => {const successCount = results.filter(r => r.status === 'fulfilled').length;const failureCount = results.filter(r => r.status === 'rejected').length;console.log(`成功: ${successCount}, 失败: ${failureCount}`);if (failureCount === 0) {console.log('成功')} else {console.log(`成功${successCount}个,失败${failureCount}`);reject(new Error('部分失败'));}
}).finally(() => {
});

解决办法二

一些老环境不支持最新API,手动实现

手动实现一

const results = [];
let completedCount = 0;
const totalCount = allPromises.length;allPromises.forEach((promise, index) => {promise.then((res) => {results[index] = { success: true, data: res };}).catch((err) => {results[index] = { success: false, error: err };}).finally(() => {completedCount++;if (completedCount === totalCount) {// 所有接口都完成了const successCount = results.filter(r => r.success).length;const failureCount = results.filter(r => !r.success).length;console.log(`成功: ${successCount}, 失败: ${failureCount}`);if (failureCount === 0) {console.log('成功')} else {console.log(`成功${successCount}个,失败${failureCount}`);reject(new Error('部分失败'));}}});
});

手动实现二


// 手动实现 Promise.allSettled
function promiseAllSettled(promises) {return Promise.all(promises.map(promise =>Promise.resolve(promise).then(value => ({ status: 'fulfilled', value })).catch(reason => ({ status: 'rejected', reason }))));
}// 使用方式
promiseAllSettled(allPromises).then((results) => {const successCount = results.filter(r => r.status === 'fulfilled').length;const failureCount = results.filter(r => r.status === 'rejected').length;console.log(`成功: ${successCount}, 失败: ${failureCount}`);if (failureCount === 0) {console.log('成功')} else {console.log(`成功${successCount}个,失败${failureCount}`);reject(new Error('部分失败'));}
}).finally(() => {this.isLoading = false;
});
http://www.dtcms.com/a/424209.html

相关文章:

  • 网站本科腾讯企点
  • 杭州高端品牌网站建设网站建设维护升级
  • 上海大规模网站建设平台北京城市副中心投资建设公司网站
  • 360免费建站空间网站建设网络安全
  • 金融适合什么颜色做网站广州seo公司官网
  • DeepSeek-V3.2:DSA稀疏注意力的降本增效
  • SpringBoot 不更改 pom.xml 引入各种 JDBC 驱动 jar 包
  • 【37】C# WinForm入门到精通 —— Winform界面运行后,界面上的字体 图案 整体感觉模糊,解决办法
  • 哪家公司建5g基站网站怎么做qq的授权登陆
  • 做解析视频网站违法莫网站调优技能
  • 个人建设视频网站ppt模板制作免费下载
  • 20250929的学习笔记
  • 字节序和位操作
  • 没有公司自己做网站百度云wordpress怎么搭建网站
  • 《Python 中的“面向接口编程”:抽象基类的力量与实践指南》
  • 25.渗透-.Linux基础命令(十七)-Linux系统状态管理(安全加固-删除无关账户)
  • wordpress响应式网站模板下载企业手机网站建设流程图
  • ollama离线部署加载Bge-M3向量模型
  • 全站仪快速建站本地建站工具
  • AI照片转二次元
  • A股大盘数据-20250929分析
  • 攻防世界-Web-upload1
  • 如何做DJ网站网站兼容ie代码
  • 基于海思Hi3798MV200 Android7.0实现电影播放蓝光导航功能
  • 北京便宜网站建设网页设计策划案范文
  • 健康类网站模板北京酒店团购网站建设
  • 儿童玩具网站建设策划书国家企业信息系统官方
  • 2025-9-29学习笔记
  • 90自己做网站建站模板工程造价
  • 给客户建完美网站后端开发是干什么的