async await 方法实现

47 阅读1分钟

利用generator,迭代器 实现async await 方法


function *generator(){
    try{
        const a = yield new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(2)
            },1*1000)
          })
          console.log(a)
          const b =  yield new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject(a+1)
            },a*1000)
          })
          console.log(b)
          const c =  yield new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(b+1)
            },b*1000)
          })
          console.log(c)
    }catch(err){
        console.log(err)
    }
}



function asyncFunc(func){
    // 传入个生成器函数 
    const p = func(); 
    // async的函数返回是个promise对象,所以 这边暂时先 输出个promise对象
    return new Promise(function (resolve,reject){
        function start(res){
            const { value, done } = p.next(res);
            // done=true说明迭代完成 
            if(done){
                resolve(value)
            }else{
               Promise.resolve(value).then((res)=>{
                  start(res)
               },(err)=>{
                  // 终止后面运行并 返回错误 结果
                  reject(err);
                  p.throw(err);
               })
            }
        }
        start();
    })
}