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

标签 javascript node.js asynchronous async-await promise

我创建了如下三个 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();
})();

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

Promise One Promise Two Promise Three
default: 2.004s

据我所知,每个等待都有 2000 毫秒的运行时间。但是,它没有。

在这种情况下,我上面使用 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);
  });
})();

最佳答案

在这两种情况下,您都会立即构建所有 Promise。在 PromiseThree 的声明结束后,对于这两种情况,您都会留下 3 个 Promise,每个 Promise 都会在 2 秒后解析。无论脚本后面发生什么,每一个都会在 2 秒后解决。

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

如果您使用 async/await,您等待的第一个将需要 2 秒才能解决。同时,另外两个已经解决了,所以执行 await PromiseTwoawait 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;

如果您在 await 之前的 promise 之后 构建 其他 promise ,情况会有所不同 - 在这种情况下,它们会按照您的预期串行运行等待

let makePromise = () => new Promise(resolve => {
  setTimeout(() => {
    resolve();
  }, 2000);
});
console.log('starting');
(async () => {
  console.time();
  await makePromise();
  await makePromise();
  await makePromise();
  console.timeEnd();
})();

关于javascript - 为什么 async await 和 Promise.all 的运行时间相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74187944/

相关文章:

javascript - 使用jquery显示和隐藏div?

javascript - 在一个请求中一一发回响应?

node.js - 多部分表单组件 "cannot POST/divespotform"无法正常工作 parseInt 问题?

javascript - 将组合键检测定位到 DOM 的特定事件部分

javascript - 如何在 ng-repeating 两次时获取特定的 json 值?

javascript - 在 haskell websockets 示例服务器上捕获刷新?

node.js - 在AnswerIntentHandler中运行exports.handle - node.js - Alexa技能

javascript - Ember.js 异步模型

javascript - setTimeout函数和异步函数

node.js - async.parallel 和 async.series 有什么区别?