(二)22.Generator19-08-16

2019-11-03  本文已影响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();
}
上一篇 下一篇

猜你喜欢

热点阅读