美文网首页
EcmaScript6简述Generator

EcmaScript6简述Generator

作者: LeeYaMaster | 来源:发表于2019-05-16 23:18 被阅读0次

    Generator是什么?

    Generator是什么?有什么用?其实看下面这段代码,一看就明白了:

                  {
                  // genertaor基本定义
                  let tell=function* (){
                    yield 'a';
                    yield 'b';
                    return 'c'
                  };
                
                  let k=tell();
                
                  console.log(k.next());//a,done:false
                  console.log(k.next());//b,done:false
                  console.log(k.next());//c,done:true
                  console.log(k.next());//d,done:true
                }
    

    这个函数,与其他函数,不一样的地方,就在于function*,有个 * 号,这也代表了,是Generator函数,其实,yield可以看成是一个断点,next为下一步,这跟我们在代码里写debugger一模一样,也没什么难的。

    Generator与iterator迭代器

    我们再继续研究代码,发现next这东西,iterator这迭代器也有呀,于是我们看官网,Generator函数返回的就是一个iterator迭代器,所以可以一直调用next方法。

                {
                    let obj = {};
                    obj[Symbol.iterator] = function*() {
                        yield 1;
                        yield 2;
                        yield 3;
                    }
    
                    for(let value of obj) {
                        console.log('value', value);
                    }
                }
    

    代码执行效果还是一样的,同样,也可以用for of循环,这样就不用一直next了。

    应用场景

      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());
    

    这段代码,可以一直轮询,输出A,B,C,A,B,C,这种方式,对于业务需求来说,还是可以用上。

    最常见的,长轮询

    {
      // 长轮询
      let ajax=function* (){
        yield new Promise(function(resolve,reject){
          setTimeout(function () {
            resolve({code:0})
          }, 200);
        })
      }
    
      let pull=function(){
        let genertaor=ajax();
        let step=genertaor.next();
        step.value.then(function(d){
          if(d.code!=0){
            setTimeout(function () {
              console.info('wait');
              pull()
            }, 1000);
          }else{
            console.info(d);
          }
        })
      }
      pull();
    }
    

    根据这里的if(d.code!=0),照理说应该是后端返回参数,判断是否等于0,如果不等于0,就一秒钟之后再次执行这段代码,非常适合倒计时,每隔一秒种判断参数是否改变。

    相关文章

      网友评论

          本文标题:EcmaScript6简述Generator

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