异步解决之Generator

Generator

1、 生成方式:

  function * fn1(){
        let obj = yield '第一条测试数据'
        let obj1 = yield '第二条数据'
        return '测试完over!'
  }

  fn1.next()    //使用 

传递参数

  fn1.next(name:'qiang');
  这个参数上传给上一个yiel关键字的返回值。     

实战!

   function* initData() {
          let categoryList = yield getShopCategory();
          let goods = yield getGoods(categoryList[0].id)
          let comment = yield getComment(goods[0].id);
          return comment;
      }
  
      let gen = initData();
      gen.next().value.then(res => {
          gen.next(res).value.then(res => {
              gen.next(res).value.then(res => {
                  // console.log(gen.next(res).value);
                  gen.next(res);
              })
          })
      })

由于过程比较繁琐一直调用then()方法。所以进行了优化

  编写一个执行器,去递归调用执行。
  //执行器
  function run() {
          let lt = gen();
          //递归调用
          return new Promise((resolve, reject) => {

              function step(data) {
                  if (data.done) {
                      console.log('执行over');
                  } else {
                      data.value.then(res => {
                          step(lt.next(res));

                      })
               }
              }
              step(lt.next());
          })
      }   

这也是async/await的实现原理

原文地址:https://www.cnblogs.com/qianqiang0703/p/13606430.html