async/await 的原理是什么?与 Promise 有什么关系?
请解释 async/await 的工作机制,以及它和 Generator + co 的关系。
回答
苦行僧
async/await 是 Generator 和 Promise 的语法糖。
工作原理:
async函数返回一个 Promise- 函数内部遇到
await会暂停执行,等待 Promise 完成后再继续 await后面的表达式会自动包装为 Promise.resolve()await只能在 async 函数中使用
Generator + co 实现原理:
// co 库的核心思想
function co(gen) {
return new Promise((resolve, reject) => {
const g = gen();
function step(next) {
if (next.done) return resolve(next.value);
Promise.resolve(next.value).then(
v => step(g.next(v)),
e => g.throw(e)
);
}
step(g.next());
});
}
async/await 本质:
async function fn() {
const res = await fetch(url);
return res.json();
}
// 等价于
function fn() {
return fetch(url).then(res => res.json());
}
优势:
- 代码更接近同步写法,可读性高
- try/catch 可以捕获 await 的所有异常
- 条件分支和循环中更自然的异步控制