async 和 await 几乎是 NodeJS 的最典型关键字,最能代表 NodeJS 的特色,然而掌握这两个关键字的原理却不容易。这篇文章使用从零“构建”出 async 和 await 关键字的方式,来帮助理清 async 和 await 的本质。
先用一句话概括:async 和 await 是内置了执行器的 generator 函数。
什么是 generator 函数?顾名思义,generator 函数就是一个生成器。生成的是一个可以多次通过 .next() 迭代的对象,例如,定义一个 generator 函数如下:
let g = function*() {
yield1yield2
return 3}
其中,yield 关键字定义每次迭代的返回值,最后一个返回值用 return。
然后,就可以用它来生成一个可迭代的对象:
let iter =g()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
以上代码执行的结果是:
{ value: 1, done: false}
{ value:2, done: false}
{ value:3, done: true}
{ value: undefined, done:true }
generator 函数也可以接收参数:
let g = function*(a, b) {
yield a
yield breturn a +b
}
let iter= g(1, 2)
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
执行结果:
{ value: 1, done: false}
{ value:2, done: false}