当 Promise 已经运行时,Promise.all 是否比单独的等待语句更快?

问题描述 投票:0回答:1

假设我们有两个承诺,

p1
p2
,我们正在尝试分别得到他们的结果,
r1
r2
。假设所有其他条件相同,这三个选项中哪一个更快?为什么? 具体来说,哪个选项会导致控制台语句首先运行?

选项1

// Call the async functions first to start the promises.
const p1 = func1();
const p2 = func2();


const r1 = await p1;
const r2 = await p2;

console.log('Done');

选项2

// Call the async functions first to start the promises.
const p1 = func1();
const p2 = func2();


const [r1, r2] = await Promise.all([p1, p2]);

console.log('Done');

选项3

// Use Promise.all from the beginning:
const [r1, r2] = await Promise.all[func1(), func2()];

console.log('Done');
javascript node.js asynchronous async-await promise
1个回答
0
投票

这真的很简单,您有 2 个案例需要检查:

p1
需要比
p2
更长的时间或
p2
需要比
p1
更长的时间。

p1
p2

需要更长的时间

这意味着当您第一次

await p1
时,您将在那里完成所有等待。达到
await p2
就已经解决了,无需等待。

这意味着您最多等待

p1
时间。换句话说,你最多等最长的一个。

p2
p1

需要更长的时间

这意味着当您第一次

await p1
时,您将在那里进行一些等待。达到
await p2
,您必须等待剩余时间才能解决。

这意味着您最多等待

p2
时间。换句话说,你最多等最长的一个。

等待 Promise.all([p1, p2])

承诺已经在运行,并且由于

Promise.all
仅在每个底层解析时才解析,因此您最多只能等待最长的一个。

同样适用于

Promise.all([myFuncA(), myFuncB()])

那么

Promise.all
有什么意义呢?

区别在于以下代码:

const r1 = await myFuncA();
const r2 = await myFuncB();

在这里,与您的所有示例不同,承诺尚未运行:它们是在

await
表达式中“动态”创建的。

这意味着您必须等待

p1 + p2
时间,而不是
max(p1, p2)
时间。

此外,在您的示例中,您只有 2 个承诺,因此仍然可以“手动”拆分它们。

当你有一个未知长度的数组(例如

something.map(...)
)或者甚至只是一次创建一大块承诺时,将它们放入
Promise.all
中只是不太挑剔。

© www.soinside.com 2019 - 2024. All rights reserved.