js 使用迭代器、生成器实现 asycn await

// 创建一个生成器
function* gen() {
  let res = yield new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("结果1");
    }, 1000);
  });
  console.log(res);
  let res2 = yield new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("结果2");
    }, 1000);
  });
  console.log(res2);
  let res3 = yield "同步的结果3";
  console.log(res3);
}


(function () {
  // 创建迭代器
  // 用以控制生成器的迭代
  let iterator = gen();
  const ite = iterator.next();
  if (!ite.done) {
    Async(iterator, ite.value);
  }

  // 对结果进行迭代处理
  function Async(iterator, ite) {
    if (ite instanceof Promise) {
      ite.then((res) => {
        let ite1 = iterator.next(res);
        if (!ite1.done) {
          if (!ite1.value instanceof Promise) {

          } else {

            Async(iterator, ite1.value);
          }
        }
      });
    } else {
      let ite1 = iterator.next(ite);
      if (!ite1.done) {
        Async(iterator, ite1.value);
      }
    }
  }
})();

代码思路

  1. gen函数 是一个生成器函数,函数内放异步代码 类似于 async 函数;yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字
  2. iterator 是一个迭代器 用于控制gen 函数的执行 并调用next方法 给yield返回一个值;
  3. Async 用于递归执行迭代器 执行yield后边的表达式 并返回结果,直到函数执行完毕;
posted @ 2023-05-24 11:45  spongeCoder  阅读(64)  评论(0)    收藏  举报