async function foo() { return 42; }
// 等价于:
function foo() { return Promise.resolve(42); }
async/await
的实现可视为 生成器函数 + 自动执行器 的语法糖。
例如,以下代码:
async function example() {
let a = await PromiseA();
let b = await PromiseB(a);
return b;
}
会被转译为类似:
function example() {
return spawn(function* () {
let a = yield PromiseA(); // 暂停,等待 PromiseA 完成
let b = yield PromiseB(a); // 再次暂停,等待 PromiseB 完成
return b;
});
}
其中,spawn 是一个自动执行生成器的工具函数,负责处理 Promise 的解析和恢复执行。
自动执行器的伪代码逻辑:
function spawn(generator) {
return new Promise((resolve, reject) => {
const gen = generator(); // 启动生成器
function step(nextFn) {
let next;
try {
next = nextFn(); // 执行下一步(可能抛出错误)
} catch (e) {
return reject(e); // 捕获错误,Promise 变为 rejected
}
if (next.done) {
return resolve(next.value); // 生成器执行完毕,返回最终值
}
// 将 next.value 视为 Promise,等待其完成
Promise.resolve(next.value).then(
(v) => step(() => gen.next(v)), // 成功:恢复生成器并传入结果
(e) => step(() => gen.throw(e)) // 失败:向生成器抛出错误
);
}
step(() => gen.next()); // 启动生成器
});
}
async function demo() {
console.log(1);
await Promise.resolve(); // 微任务入队
console.log(2);
}
demo();
console.log(3);
// 输出顺序:1 → 3 → 2
async function fetchData() {
try {
let data = await fetch(url);
} catch (e) {
console.error("请求失败:", e);
}
}
底层是 Promise 的 .catch(),错误会被传递到最近的 catch 块。