跳到主要内容

实现

一、思路


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();

参考资料


async 函数的实现原理

9k字 | Promise/async/Generator实现原理解析