假设我们有两个承诺,
p1
和p2
,我们正在尝试分别得到他们的结果,r1
和r2
。假设所有其他条件相同,这三个选项中哪一个更快?为什么?
具体来说,哪个选项会导致控制台语句首先运行?
// 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');
// 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');
// Use Promise.all from the beginning:
const [r1, r2] = await Promise.all[func1(), func2()];
console.log('Done');
这真的很简单,您有 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
中只是不太挑剔。