async/await本质上是一个generator/yield的语法糖,通过内置一个执行器,来实现自动执行。
generator/yield的实现可参考上一篇 generator动手实现
自动执行器
1 | // 一个简单的自动执行器 |
下面验证下我们刚才写的执行器是否能正常工作1
2
3
4
5
6
7
8
9
10
11
12
13
14function *test() {
var a = yield 1;
console.log(a);
var b = yield 2;
console.log(b)
}
autoGen(test);
console.log('after gen');
// 输出结果
// after gen
// 1
// 2
// Promise {<resolved>: undefined}
async/await
async/await的实现可以看做是先把async/await转换为generator/yield语法,再通过上面的自动执行器包裹执行
forEach
1 | async function fn(v) { return Promise.resolve(v); } |
这种写法实际上并不是顺序执行的, 它等同于1
2
3
4
5
6var temp = async function(item) {
await fn(item)
}
for (var i = 0, len = arr.length; i < len; i++) {
temp(arr[i]);
}
every/some等函数都存在这个问题,如果希望顺序执行可直接使用for循环
补充:一个细微差别
1 | const p = Promise.resolve(); |
以上在node8下运行结果:1
2
3after:await
tick:a
tick:b
node10下运行结果1
2
3tick:a
tick:b
after:await