generator + co === async await

async function 等价于:

  1. 把函数转换成 generator

  2. 把每个 await 转换成 yield

  3. 自动执行 generator(像 co 那样)

浏览器中的 async/await 底层原理就是这样(但更复杂且优化很多)

let fs = require("fs").promises;
function* read() {
  try {
    // 这个代码肯定是异步的,但是写的像同步代码
    let url = yield fs.readFile("./fileUrl1.txt", "utf8");
    let name = yield fs.readFile(url, "utf8");
    return name;
  } catch (e) {
    console.log(e, 55);
  }
}
/*
let it = read();
let { value, done } = it.next();
if (!done) {
  value.then((data) => {
    let { value, done } = it.next(data);
    if (!done) {
      value.then((data) => {
        let { value, done } = it.next(data);
        console.log(value, done);
      });
    }
  });
}
*/
function co(it) {
  // 串行执行,基于回调
  return new Promise((resolve, reject) => {
    function next(data) {
      let { value, done } = it.next(data);
      if (!done) {
        Promise.resolve(value).then(
          (data) => {
            next(data);
          },
          (err) => {
            it.throw(err);
          }
        );
      } else {
        resolve(value);
      }
    }
    next();
  });
}
co(read()).then((data) => {
  console.log(data);
});

  

posted @ 2025-12-10 10:42  jerry-mengjie  阅读(33)  评论(0)    收藏  举报