美文网首页
(二)22.Generator19-08-16

(二)22.Generator19-08-16

作者: 你坤儿姐 | 来源:发表于2019-11-03 17:44 被阅读0次
    {
      //generator的基本定义
      //创建一个generator函数
      let tell=function* () {
        yield 'a';
        yield 'b';
        return 'c'
      };
    
      let k=tell();
    
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());
    }
    
    
    {
      //generator也可以做遍历器的返回值
    
      let obj={};
      obj[Symbol.iterator]=function* (){
        yield 1;
        yield 2;
        yield 3;
      }
    
      for(let value of obj){
        console.log('value',value);
      }
    }
    
    
    {
      //什么时候generator函数有着最大的优势呢
    
      //状态机 可以不断地获取当前的状态
      let state=function* (){
        while (1){
          yield 'A';
          yield 'B';
          yield 'C';
        }
      }
      let status=state();
      console.log(status.next());
      console.log(status.next());
      console.log(status.next());
      console.log(status.next());
      console.log(status.next());
    }
    
    
    // {
    //   //async用法   想要执行需要安装一些插件
    //   let state=async function (){
    //     while (1){
    //       await 'A';
    //       await 'B';
    //       await 'C';
    //     }
    //   }
    //   let status=state();
    //   console.log(status.next());
    //   console.log(status.next());
    //   console.log(status.next());
    //   console.log(status.next());
    //   console.log(status.next());
    // }
    
    {
      // 实例 抽奖次数逻辑 没抽一次减少一次机会 抽完为止
      let draw=function(count){
        //具体抽奖逻辑
    
        //输出剩余次数
        console.info(`剩余${count}次`)
      }
    
      //写一个generator函数
      let residue=function* (count) {
        while (count>0){
          count--;//没抽奖一次计数减一
          yield draw(count);
        }
      }
    
      let star=residue(5);
    
      //给页面添加一个按钮
      let btn=document.createElement('button');
      btn.id='start';
      btn.textContent='抽奖';
      document.body.appendChild(btn);//按钮添加到页面上
      //注册一下事件
      document.getElementById('start').addEventListener('click',function () {
        star.next();
      },false)
    }
    
    {
      //长轮询
      let ajax=function* () {
        yield new Promise(function(resolve,reject) {
          setTimeout(function () {
            resolve({code:0})
          },200)
        })
      }
    
      let pull=function(){
        let generator=ajax();
        let step=generator.next();
        step.value.then(function(d){
          if(d.code!=0){
            setTimeout(function () {
              console.log('wait');
              pull()
            },1000);
          }else {
            console.log(d);
          }
        })
      }
      pull();
    }
    

    相关文章

      网友评论

          本文标题:(二)22.Generator19-08-16

          本文链接:https://www.haomeiwen.com/subject/teqqsctx.html