为什么 async wait 和 Promise.all 的运行时间相同?

Jun*_*ark 3 javascript asynchronous node.js promise async-await

我创建了三个 Promise,如下所示并等待它们,预计它们需要 6000 毫秒:

let PromiseOne = new Promise(resolve => {
  setTimeout(() => {
    resolve('Promise One');
  }, 2000);
});

let PromiseTwo = new Promise(resolve => {
  setTimeout(() => {
    resolve('Promise Two');
  }, 2000);
});

let PromiseThree = new Promise(resolve => {
  setTimeout(() => {
    resolve('Promise Three');
  }, 2000);
});

(async() => {
  console.time();
  let ResponseOne = await PromiseOne;
  let ResponseTwo = await PromiseTwo;
  let ResponseThree = await PromiseThree;

  console.log(ResponseOne, ResponseTwo, ResponseThree);
  console.timeEnd();
})();
Run Code Online (Sandbox Code Playgroud)

但是,我收到了一条意外的控制台消息,如下所示。

Promise One Promise Two Promise Three
default: 2.004s
Run Code Online (Sandbox Code Playgroud)

据我所知,每个await都有2000ms的运行时间。但是,事实并非如此。

async在这种情况下,我上面使用/ 的代码await和下面使用 的代码有什么区别Promise.all

let PromiseOne = new Promise(resolve => {
  setTimeout(() => {
    resolve('Promise One');
  }, 2000);
});

let PromiseTwo = new Promise(resolve => {
  setTimeout(() => {
    resolve('Promise Two');
  }, 2000);
});

let PromiseThree = new Promise(resolve => {
  setTimeout(() => {
    resolve('Promise Three');
  }, 2000);
});

(() => {
  Promise.all([PromiseOne, PromiseTwo, PromiseThree]).then(res => {
    console.log(res);
  });
})();
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 9

在这两种情况下,您都会立即构建所有 Promise。在声明结束后PromiseThree,对于两者来说,你都剩下 3 个承诺,每个承诺都会在 2 秒后解决。无论脚本稍后发生什么,每个问题都会在 2 秒后解决。

如果你使用Promise.all,所有的 Promise 将在 2 秒后解决。

如果您使用async/ await,您等待的第一个将需要 2 秒才能解析。与此同时,另外两个也将得到解决,因此这样做await PromiseTwo几乎await PromiseThree不需要任何时间 - 因此,总共仍然需要 2 秒。

// at this point, each promise has been created and each will take 2 seconds
(async() => {
  console.time();
  // 2 seconds for the below line
  let ResponseOne = await PromiseOne;
  // after 2 seconds, all have resolved; below line takes no time at all
  let ResponseTwo = await PromiseTwo;
  // same as above
  let ResponseThree = await PromiseOne;
Run Code Online (Sandbox Code Playgroud)

如果您在 ing 之前的承诺之后构建其他承诺,情况会有所不同await- 在这种情况下,它们会按照您期望的那样串行运行await

// at this point, each promise has been created and each will take 2 seconds
(async() => {
  console.time();
  // 2 seconds for the below line
  let ResponseOne = await PromiseOne;
  // after 2 seconds, all have resolved; below line takes no time at all
  let ResponseTwo = await PromiseTwo;
  // same as above
  let ResponseThree = await PromiseOne;
Run Code Online (Sandbox Code Playgroud)