CodeWalk

async/await 的原理是什么?与 Promise 有什么关系?

作者:苦行僧 · 2026-05-30 12:55

请解释 async/await 的工作机制,以及它和 Generator + co 的关系。

回答

苦行僧

async/await 是 Generator 和 Promise 的语法糖。

工作原理

  1. async 函数返回一个 Promise
  2. 函数内部遇到 await 会暂停执行,等待 Promise 完成后再继续
  3. await 后面的表达式会自动包装为 Promise.resolve()
  4. 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 的所有异常
  • 条件分支和循环中更自然的异步控制