javascript - 是什么让 `async/await` 语句在 ES6 中顺序运行而不是并行运行?

标签 javascript ecmascript-6 async-await es6-promise

我已经通过线程 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/

相关文章:

kotlin - Kotlin 中与 C# 8 的异步枚举等效的是什么?

java - 等到每个外部线程上的 RxJava 出现更多条件 - 跨线程执行单个操作

Javascript - 从对象 ->数组时保持键顺序

javascript - 如何检查 ES6 "variable"是否不变?

javascript - 在 ES6 中针对 `let` 和 block 作用域进行提升

javascript - SailsJS 是否支持 ES6?

c# - 有效返回 "Task<Task<MyObject>>"吗?或者最好返回 "Task.FromResult(MyObject)"

javascript - 将多个文本实例添加到 HTML5 Canvas

javascript - Laravel Vue.js - 包含 vue-router 的最简单方法?

javascript - 如何生成四位数代码(即 0001)javascript