es6(15)--generator

  1 //generator处理异步,下一步用next,遇到return或者yied就会停止
  2 {
  3     //generator基本定义
  4     let tell=function* (){
  5         yield 'a';
  6         yield 'b';
  7         return 'c'
  8     };
  9     let k=tell();
 10     console.log(k.next());
 11     console.log(k.next());
 12     console.log(k.next());
 13     console.log(k.next());
 14 }
 15 {
 16     let obj={};
 17     obj[Symbol.iterator]=function*(){
 18         yield 1;
 19         yield 2;
 20         yield 3;
 21     }
 22     for(let value of obj){
 23         console.log('value',value)
 24     }
 25 }
 26 {
 27     //状态机
 28     let state=function* (){
 29         while(1){
 30             yield 'A';
 31             yield 'B';
 32             yield 'C';
 33         }
 34     }
 35     let status=state();
 36     console.log(status.next());
 37     console.log(status.next());
 38     console.log(status.next());
 39     console.log(status.next());
 40 }
 41 //和上面一样,但是需要安装插件
 42 // {
 43 //     let state=async function(){
 44 //         while(1){
 45 //             await 'A';
 46 //             await 'B';
 47 //             await 'C';
 48 //         }
 49 //     }
 50 //     let status=state();
 51 //     console.log(status.next());
 52 //     console.log(status.next());
 53 //     console.log(status.next());
 54 //     console.log(status.next());
 55 // }
 56 {
 57     //抽奖次数限制
 58     let draw=function(count){
 59         //具体逻辑
 60         console.info(`剩余${count}次数`)
 61     }
 62 
 63     let residue=function* (count){
 64         while(count>0){
 65             count--;
 66             yield draw(count);
 67         }
 68     }
 69     let star=residue(5);
 70     let btn=document.createElement('button');
 71     btn.id='start';
 72     btn.textContent='抽奖';
 73     document.body.appendChild(btn);
 74     document.getElementById('start').addEventListener('click',function(){
 75         star.next();
 76     },false)
 77 }
 78 {
 79     //长轮询
 80     let ajax=function*(){
 81         yield new Promise(function(resolve,reject){
 82             setTimeout(function(){
 83                 resolve({code:0})
 84             },1000)
 85         })
 86     }
 87     let pull=function(){
 88         let generator=ajax();
 89         let step=generator.next();
 90         step.value.then(function(d){
 91             if(d.code!=0){
 92                 setTimeout(function(){
 93                     console.log('wait');
 94                     pull()
 95                 },1000);
 96             }else{
 97                 console.info(d);
 98             }
 99         })
100     }
101     pull();
102 }

猜你喜欢

转载自www.cnblogs.com/chenlw/p/9227927.html
今日推荐