异步解决之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的实现原理

posted @   赛德·乌漆嘛黑  阅读(128)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示