是什么让 `async/await` 语句在 ES6 中顺序运行还是并行运行?

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接一个地安排呼叫,因此计时器都已经排队。然后你只是在等待计时器到期并一一解决你的承诺。