我看到这篇好文章介绍了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
直接执行?
顺便问一下,我应该打开另一个问题来问这些问题吗?
答案 0 :(得分:5)
await
不会导致Promise
或其setTimeout()
启动,这似乎是您所期待的。仅对wait()
的调用会立即启动它们,无论是否存在有效的await
承诺。
await
只会帮助您了解通过承诺跟踪的已经正在进行的操作何时完成。
所以,差异只是由于调用wait()
并开始每个超时时间:
parallel()
在wait()
编辑之前,引擎可以从一个引导到下一个引导await
背靠背,因此2个超时开始/几乎在同一时间结束。
series()
强制第二个wait()
在第一个完成之后才被调用,在它们之间进行await
行为。
关于您的修改,async
和await
是语法糖。使用它们,引擎将在运行时修改您的函数,插入与promises交互所需的其他代码。
(可能但不准确)相当于series()
而不是await
和async
可能是:
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()
中,您可以在await
中series()
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");
}