别再乱用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 国际」许可协议进行许可。

转载请注明原处

posted @   Carver-大脸猫  阅读(21)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu