Dee*_*dhy 17 javascript async-await ecmascript-6 es6-promise
我已经通过线程Await Promise.all() 和multiple await 之间有什么区别?,所以我很清楚 Promise.all 和多次等待。
不过,我对以下 2 种情况还不是很清楚。
在案例 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()Run Code Online (Sandbox Code Playgroud)
案例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()Run Code Online (Sandbox Code Playgroud)
Ful*_*Guy 11
在第一种情况下,由于await在每次调用 之前promiseWait,甚至要开始执行对 的下一次调用,promiseWait它都需要等到对 的第一次调用promiseWait完全完成。所以你会看到顺序执行。
在第二种情况下,你已经调用所有的promiseWait开始,等待他们之前的功能。所以promiseWait已经开始执行了,那你就一个接着一个地等待结果。
在第一种情况下实现明智,对 的下一次调用setTimeout必须等到第一个setTimeout到期。所以第二个、第三个和第四个定时器需要等到第一个定时器到期并解析 promise 才能被调度。
在秒的情况下,您一个setTimeout接一个地安排呼叫,因此计时器都已经排队。然后你只是在等待计时器到期并一一解决你的承诺。