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

ema*_*rel 3 javascript asynchronous promise

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

例如:

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

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

Rah*_*obe 11

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

所以,是的,promise1()promise2()promise3()可以说是在这方面并行运行。并且之前有机会promise2()得到解决promise1()等等。该函数Promise.all()等待提供给它的所有承诺履行或至少其中一项失败。

观看 Jake Archibald 的这段视频,了解有关 Javascript 事件循环的更多信息。


Man*_*uel 9

Promise.all不会让你的承诺同时进行。
Promise.all根本不会兑现你的承诺。
所做Promise.all的,只是等待所有的承诺完成。

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

const promises = [promise1(), promise2(), promise3()]
Run Code Online (Sandbox Code Playgroud)

假设您的 Promise 进行 HTTP 调用:

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

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

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

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