别再乱用Promise.all 和 Promise.allSettled了
Promise.all 用法#
-
定义:
Promise.all()
方法接受一个包含多个 Promise 实例的可迭代对象(如数组),并返回一个新的 Promise 实例。该 Promise 实例会在所有输入的 Promise 都成功解决时被解决,或者在任意一个 Promise 被拒绝时被拒绝。 -
工作机制:
-
全部成功或立即失败:只有当所有提供的 Promise 都成功解决时,
Promise.all()
返回的 Promise 才会变为 resolved 状态,并返回一个包含所有 Promise 结果的数组。如果其中一个 Promise 被拒绝,Promise.all()
返回的 Promise 将立即变为 rejected 状态,并返回第一个被拒绝的 Promise 的错误信息。 -
结果顺序:返回的结果数组中的元素顺序与输入的 Promise 数组中的顺序一致,与各 Promise 完成的先后顺序无关。
-
-
示例:
const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); Promise.all([promise1, promise2, promise3]).then((results) => { console.log(results); // 输出 [1, 2, 3] });
Promise.allSettled 用法#
-
定义:
Promise.allSettled()
方法接受一个包含多个 Promise 实例的可迭代对象(如数组),并返回一个新的 Promise 实例。该 Promise 实例会在所有输入的 Promise 都确定其结果(无论是成功还是失败)时被解决。 -
工作机制:
-
全部完成:无论输入的 Promise 是成功还是失败,
Promise.allSettled()
返回的 Promise 都会等待所有 Promise 完成后才变为 resolved 状态。 -
结果格式:返回的 Promise 的值是一个数组,每个元素对应于原始 Promises 数组中的一个位置,表示相应 Promise 的结果或原因。如果 Promise 成功,则为
{status: 'fulfilled', value: result}
;如果 Promise 失败,则为{status: 'rejected', reason: error}
。
-
-
示例:
const promise1 = Promise.resolve(1); const promise2 = Promise.reject('错误'); const promise3 = new Promise((resolve) => setTimeout(resolve, 100, 3)); Promise.allSettled([promise1, promise2, promise3]).then((results) => { console.log(results); /* [ {status: "fulfilled", value: 1}, {status: "rejected", reason: "错误"}, {status: "fulfilled", value: 3} ] */ });
Promise.all 和 Promise.allSettled 的区别#
-
错误处理:
-
Promise.all()
会在任意一个 Promise 被拒绝时立即终止执行并返回错误,不会等待其他 Promise 完成。 -
Promise.allSettled()
则会等待所有 Promise 完成,无论它们是成功还是失败,然后返回每个 Promise 的结果或原因。
-
-
结果返回:
-
Promise.all()
返回的结果是一个数组,包含所有 Promise 的成功结果,顺序与输入的 Promise 数组一致。 -
Promise.allSettled()
返回的结果是一个数组,每个元素是一个对象,包含对应 Promise 的状态和值或原因。
-
-
适用场景:
-
Promise.all()
适用于所有异步任务都需要成功完成的情况,例如多个数据请求都必须成功才能继续后续操作。 -
Promise.allSettled()
适用于需要同时发起多个异步操作,并希望知道每个操作的具体结果的情况,即使部分操作失败也不会影响整体流程。
-
作者:Carver-大脸猫
出处:https://www.cnblogs.com/carver/articles/18754257
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请注明原处
本文来自博客园,作者:Carver-大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18754257
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现