Skip to content
目录

实现 async/await

实现过程主要是借助了 generator 函数和 promise 的 resolve 和 reject

回顾 generator 函数

定义: 使用function* 进行定义 调用: 使用yield 关键字 获得结果: 使用next() 函数 传参: 使用next(value) 函数

js
    fucntion* test() {
        yield 1;
        yield 2;
        yield 3;
        return 4;
    }
    const testGenerator = test();
    console.log(testGenerator.next()); // {value: 1, done: false}
    console.log(testGenerator.next()); // {value: 2, done: false}
    console.log(testGenerator.next()); // {value: 3, done: false}
    console.log(testGenerator.next()); // {value: 4, done: true}
    console.log(testGenerator.next()); // {value: undefined, done: true}

封装 async/ await

js
function generatorToAsync(generatorFunc) {
  return function () {
    const gen = generatorFunc.apply(this, arguments);
    return new Promise((resolve, reject) => {
      // 实现一个step函数
      function step(key, arg) {
        let res;
        try {
          res = gen[key](arg);
        } catch (error) {
          return reject(error);
        }
        const { value, done } = res;
        if (done) {
          return resolve(value);
        } else {
          return Promise.resolve(value).then(
            (val) => step("next", val),
            (err) => step("throw", err)
          );
        }
      }
      step("next");
    });
  };
}

If there is any reprint or CV, please mark the original address of this website