Loading

ES6实现async/await

// gen 为generator
实现Async的主要思路

  1. Async返回的是一个promise对象
  2. 使用一个step对generator进行遍历
  3. 使用一个Promise.resolve()来拿到每个yield的返回值,并且在下一次调用时传入,循环以往直到结束
  4. 有错误使用throw方法抛出,在generator内部捕获错误,然后成为reject状态,返回错误结果
function myAsync(genF){
    return new Promise(function(resolve, reject) { // async返回的是一个promise对象
        const gen = genF(); // 拿到这个遍历器
        function step(nextF) {
          let next;
          try {
            next = nextF(); // 执行传入的回调函数获取{value:xx,done:xx}
          } catch(e) {// 出错就直接抛出,抛出的错误就是当前出错的promise对象
            return reject(e);
          }
          if(next.done) {//完成就直接resolve
            return resolve(next.value);
          }
          // 直接resolve当前的指针指向的对象然后继续执行下一个
          Promise.resolve(next.value).then((res)=> {
            step(()=> gen.next(res)); // 返回上一个promise对象的返回值
          }).catch((e)=>{
            step(()=> gen.throw(e)); // 错误就抛出
          })
        }
        // 初始化调用这个遍历器
        step(()=> gen.next());
      });
}


// 测试代码
myAsync(function* () {
    const a = yield Promise.resolve(1)
    const b = yield new Promise((res, rej) => {
        setTimeout(() => {
            res(2)
        }, 2000)
    })
    const c = yield Promise.resolve(3)
    console.log(a, b, c);

    try {
        const d = yield Promise.reject(4)
    } catch (error) {
        console.log(error);
    }

    return [a, b, c]
}).then(console.log)
// 输出
// 1 2 3
// 4
// [1,2,3]
posted @ 2021-01-24 17:57  不吃苦瓜^  阅读(167)  评论(0编辑  收藏  举报