{
//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();
}
网友评论