【发布时间】:2021-01-27 10:00:19
【问题描述】:
我已经通过线程Any difference between await Promise.all() and multiple await?,所以我很清楚 Promise.all 和多个等待。
不过,我对以下两种情况不是很清楚。
为什么在案例 1 中它是顺序执行(需要 10 秒)而在案例 2 中它是并行执行(需要 4 秒)?
案例一:
function promiseWait(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(true);
}, time);
});
}
async function test1() {
var t0 = performance.now()
var a = await promiseWait(1000)
var b = await promiseWait(2000)
var c = await promiseWait(3000)
var d = await promiseWait(4000)
var t1 = performance.now()
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds."); //takes 10secs
}
test1()
案例 2:
function promiseWait(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(true);
}, time);
});
}
async function test2() {
var t0 = performance.now()
const p1 = promiseWait(1000);
const p2 = promiseWait(2000);
const p3 = promiseWait(3000);
const p4 = promiseWait(4000);
const a = await p1;
const b = await p2;
const c = await p3;
const d = await p4;
var t1 = performance.now()
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.")
}
test2()
【问题讨论】:
-
因为 1) 在每个 await 中,在执行下一个语句之前等待承诺解决 - 在 2) 您开始承诺而不等待前一个解决 - 所以它们并行运行跨度>
-
因为它实际上确实......在这些等待之间......如果你不相信我的话,放一些 console.logs......他们会在每个承诺解决时间隔 1 秒输出/跨度>
-
.allSettled 就像 .all - 但从不拒绝,总是被解决 - 结果显示单独的解决/拒绝状态......而对于 .all,一个拒绝拒绝 .all
-
Promise 仅在 底层支持(例如 XHR 请求)“并行”运行时“并行”完成(实际上,有一个限制,例如 6 个请求/域)。并发!= 并行。
-
如果您知道
Promise.all为何/如何工作,那么您应该知道它是如何工作的。它非常相似。如果您执行await Promise.all([foo(), bar(), baz()]),那么您正在调用foo、bar、bazfirst(即启动所有承诺)并将它们的返回值传递给Promise.all。它与var p1 = foo(); var p2 = bar(); var p3 = baz(); await Promise.all([p1,p2,p3])相同,而后者又与var p1 = foo(); var p2 = bar(); var p3 = baz(); await p1; await p2; await p3;“相似”(不完全相同)。
标签: javascript ecmascript-6 async-await es6-promise