生成器 & 异步任务

2022-03-03  本文已影响0人  bestCindy

我们用生成器模拟一个方法

这个方法可以用同步的方式处理异步,也就是类似 async await

function* task(url) {
  const d = yield 1;
  const resp = yield fetch(url);
  const result = yield resp.json();
  console.log(result);
}

run(task);

function run(generatorFunc) {
  const generator = generatorFunc();
  // 启动任务(开始迭代)
  let result = generator.next();
  handleResult(result);

  function handleResult(result) {
    if (result.done) {
      return;
    };
    // 迭代没有完成,分两种情况
    // 1. 迭代数据是一个 Promis
    // 2. 迭代数据是其他数据
    if (typeof result.value.then === 'function') {
      // 1. 迭代数据是一个 Promise
      // 等待 Promise 完成后,再进行下一次迭代
      result.value.then(data => {
        result = generator.next(data);
        handleResult(result);
      });
    } else {
      // 2. 迭代的数据是其他数据,直接进行下一次迭代
      result = generator.next(result?.value);
      handleResult(result);
    };
  }
}
上一篇 下一篇

猜你喜欢

热点阅读