【问题标题】:Does Promise.all() run in sequential or parallel?Promise.all() 是顺序运行还是并行运行?
【发布时间】:2025-12-27 22:00:12
【问题描述】:

Promise.all() 在 Javascript 中是顺序运行还是并行运行?

例如:

    const promises = [promise1(), promise2(), promise3()]
    Promise.all(promises)
    .then(data => {
        // whatever 
    });

promise1() 是在进入 promise2() 之前执行和解析,还是 promise1()promise2()promise 3() 都同时并行运行?我会假设浏览器中的 Node、Javascript 是单线程的,因此它们不会并行运行?

【问题讨论】:

  • 不,它们是异步的。单线程并不意味着它们同步或并行运行。单个线程仍然可以进行时间共享。
  • 节点是用户代码中的单线程。如果你调用两个读取文件的promise,它们可以同时被读取。延续(结果)再次是单线程的。
  • Angular 不会(或不应该)影响 Promise 运行时语义
  • @Thankyou,这是真的,但我发现很难信任 zone.js。 Angular 依赖于 zone.js 提供的原生 Promises 的几个附加功能。尝试使用--target ES2017 或更高版本编写async 函数,然后发现更改检测失败。
  • 没有! Promise.all() 不运行任何东西。它聚合 Promise,其中每个 Promise 都是一个值的抽象。

标签: javascript asynchronous promise


【解决方案1】:

Javascript 是一个单线程应用程序。但是,异步调用允许您不被该调用阻塞。这在进行 REST API 调用时特别有用。例如,您的promise1() 可以进行 REST API 调用,在它等待结果之前,可以从promise2() 进行另一个 REST API 调用。因此,这种伪并行性是通过不等待 API 服务器执行任务并并行触发对相同或不同 API 端点的多个此类调用来实现的。这允许您的代码继续执行不依赖于 promise 解析的部分。

所以是的,promise1()promise2()promise3() 在这方面可以说是并行运行的。 promise2() 有可能在 promise1() 之前得到解决,依此类推。函数 Promise.all() 等待提供给它的所有 Promise 完成或至少其中一个失败。

在 Jake Archibald 的 video 中了解有关 Javascript 事件循环的更多信息。

【讨论】:

    【解决方案2】:

    Promise.all 不会让你的 Promise 并行运行。
    Promise.all 根本不会让你的 Promise 运行。
    Promise.all 所做的只是等待所有的承诺完成。

    实际执行的代码行是这一行:

    const promises = [promise1(), promise2(), promise3()]
    

    假设您的承诺进行 HTTP 调用:

    promise1() 已执行 -> 1 个 HTTP 调用正在进行
    promise2() 已执行 -> 2 个 HTTP 调用正在进行
    promise3() 已执行 -> 3 个 HTTP 调用正在进行

    然后过了一段时间,这些承诺以不确定的顺序完成。

    这 3 个 HTTP 调用可以同时完成,但在您的代码中,您将有 3 个顺序完成。出于这个原因,您可以使用Promise.all 来确保您的回调仅在您的所有承诺完成时执行。

    请记住,您的环境中可以拥有的并行 HTTP 连接数量是有限制的,请看:https://*.com/a/985704/7327715

    【讨论】:

      最近更新 更多