我已经通过线程 Any difference between await Promise.all() and multiple await? ,所以我很清楚 Promise.all 和多个等待。
不过,我对以下两种情况还不是很清楚。
在案例 1 中,为什么它按顺序执行(需要 10 秒)而在案例 2 中它是并行执行(需要 4 秒)?
情况1:
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()
案例二:
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()
最佳答案
在第一种情况下,因为 await
在每次调用 promiseWait
之前, 甚至开始执行对 promiseWait
的下一次调用它需要等到第一次调用 promiseWait
完全完成。所以你会看到顺序执行。
在第二种情况下,您已经调用了 全部 promiseWait
在您开始等待它们之前执行功能。所以promiseWait
已经开始执行了,那么你在等待一个接一个的结果。
在第一种情况下明智地实现,下一次调用 setTimeout
必须等到第一个setTimeout
过期。所以第二个、第三个和第四个定时器需要等到第一个定时器到期并解析promise才能被调度。
在秒的情况下,您安排 setTimeout
一个接一个地调用,所以计时器是都已经排队了 .然后,您只是在等待计时器到期并一一解决您的 promise 。
关于javascript - 是什么让 `async/await` 语句在 ES6 中顺序运行而不是并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64328865/