zoukankan      html  css  js  c++  java
  • 异步解决之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的实现原理

  • 相关阅读:
    NOIP1998提高组——挖地雷
    模板——EXBSGS
    vue 知识点
    jq_js
    ruby 基础知识(一)
    idea maven pom配置文件
    .net core dapper (5)
    .net core dapper (4)
    .net core dapper (3)
    .net core dapper (2)
  • 原文地址:https://www.cnblogs.com/qianqiang0703/p/13606430.html
Copyright © 2011-2022 走看看