美文网首页
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