实现
一、思路
async
函数的实现原理,就是将 Generator
函数和自动执行器,包装在一个函数里。
async function fn(args) {
// ...
}
// 等同于
function fn(args) {
return spawn(function* () {
// ...
});
}
所有的async
函数都可以写成上面的第二种形式,其中的spawn
函数就是自动执行器。
二、实现
2.1 自动执行器
function spawn(genFun) {
return new Promise((resolve, reject) => {
const gen = genFun();
function step(nextFun) {
let next;
try {
next = nextFun();
} catch (e) {
return reject(e);
}
if (next.done) {
return resolve(next.value);
}
Promise.resolve(next.value).then(
(value) => {
step(function () {
return gen.next(value);
});
},
(error) => {
step(function () {
return gen.throw(error);
});
}
);
}
step(function () {
return gen.next(undefined);
});
});
}
2.2 测试实现结果
function promise1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2000);
}, 2000);
});
}
function promise2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3000);
}, 3000);
});
}
function awaitSelf(args) {
return spawn(function* () {
const result1 = yield promise1();
console.log(result1);
const result2 = yield promise2();
console.log(result2);
});
}
awaitSelf();