前端面试题 - 107. 实现一个简化版的async/await功能

355 阅读1分钟

接收一个Generator函数,并返回一个Promise,实现类似于原生的async/await的效果。

关键点:返回一个Promise。其中generator执行。然后递归处理next结果,done就resolve,否则value转成Promise处理then进行递归,catch进行throw。

function asyncToPromise(generatorFunc) {
  return new Promise((resolve, reject) => {
    const generator = generatorFunc();

    function handleResult(result) {
      if (result.done) {
        resolve(result.value);
      } else {
        Promise.resolve(result.value)
          .then((res) => handleResult(generator.next(res)))
          .catch((err) => handleResult(generator.throw(err)));
      }
    }

    try {
      handleResult(generator.next());
    } catch (error) {
      reject(error);
    }
  });
}