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 }