为什么Javascript async / await代码在parellel

时间:2018-03-15 02:22:58

标签: javascript asynchronous

我看到这篇好文章介绍了Google的async/await

但是,我无法理解为什么这些代码并行运行

async function parallel() {
  const wait1 = wait(500);
  const wait2 = wait(500);
  await wait1;
  await wait2;
  return "done!";
}

这是串联的

async function series() {
  await wait(500);
  await wait(500);
  return "done!";
}

为什么这两种方法之间的关键区别? 在我看来,他们两个都在等待承诺并且应该有相同的结果。

这是我的测试代码。可以在支持async / await的浏览器控制台中运行。

function wait(){
    return new Promise((res)=>{setTimeout(()=>{res()}, 2000)})
}
async function parallel() {
  const wait1 = wait();
  const wait2 = wait();
  await wait1;
  await wait2;
  return "done!";
}
async function series() {
  await wait();
  await wait();
  return "done!";
}
parallel().then(res => console.log("parallel!"))
series().then(res => console.log("series!"))

====== 谢谢你的回答 但我还是有一些问题。为什么确定async / await意味着什么? 据我所知,构建Promise实例将直接执行。 这是我的测试代码

function wait(){
    return new Promise((res)=>{setTimeout(()=>{console.log("wait!");res();}, 2000)})
}

wait()
//Promise {<pending>}
//wait!

let w = wait()
//undefined
//wait!

let w = await wait()
//wait!
//undefined

async function test(){await wait()}
// undefined
test()
//Promise {<pending>}
//wait!

为什么const wait1 = wait(); inside parallel function直接执行? 顺便问一下,我应该打开另一个问题来问这些问题吗?

3 个答案:

答案 0 :(得分:5)

await不会导致Promise或其setTimeout()启动,这似乎是您所期待的。仅对wait()的调用会立即启动它们,无论是否存在有效的await承诺。

await只会帮助您了解通过承诺跟踪的已经正在进行的操作何时完成。

所以,差异只是由于调用wait()并开始每个超时时间:

  • parallel()wait()编辑之前,引擎可以从一个引导到下一个引导await背靠背,因此2个超时开始/几乎在同一时间结束。

  • series()强制第二个wait()在第一个完成之后才被调用,在它们之间进行await行为。

关于您的修改,asyncawait是语法糖。使用它们,引擎将在运行时修改您的函数,插入与promises交互所需的其他代码。

(可能但不准确)相当于series()而不是awaitasync可能是:

function series() {
  return Promise.resolve()
    .then(function () { return wait(500) })
    .then(function () { return wait(500) })
    .then(function () { return "done!"; });
}

对于parallel()

function parallel() {
  const wait1 = wait(500);
  const wait2 = wait(500);

  return Promise.resolve()
    .then(wait1)
    .then(wait2)
    .then(function () { return "done!"; });
}

答案 1 :(得分:3)

parallel()中,您可以在awaitseries() await第一个wait()的结果调用两个方法然后 wait()他们的结果1}}在调用第二个Promise之前调用。

  

为什么确切的async / await意味着什么?据我所知,构建Promise实例将直接执行。

立即返回Promise实例,即同步。但是resolve的值是通过调用给定给它的构造函数的第一个参数异步计算的,这个函数通常称为await。这就是你{{1}}的目的。

答案 2 :(得分:2)

不同之处在于parallel,两个承诺都是相互安排的。

series中,您等待第一个wait 解决然后安排第二个wait被调用。

如果我们扩展方法,我们会得到类似的东西:

function parallel() {
  const wait1 = wait();
  const wait2 = wait();
  // Both wait1 and wait2 timeouts are scheduled
  return wait1
    .then(() => wait2)
    .then(() => "done");
}

function series() {
  // The second wait happens _after_ the first has been *resolved*
  return wait()
    .then(() => wait())
    .then(() => "done");
}