generator

generator


function foo(){
for(let i=0;i<3;i++){
     console.log(i);//内部有一个关键字yield
  }
}
function* foo(){ //generator特点是后面有一个星号 * foo, *foo,星号位置在function 和函数名称中间
  for(let i=0;i<3;i++){
     yield i;//内部有一个关键字yield
  }
}
console.log(foo())//不执行,因为generator需要执行器。generator函数会返回一个生成器的迭代器对象。genertor不能作为构造函数使用。yield关键字只能在generator里面使用,不能在其他地方使用。
let f=foo();//把当前函数赋给一个值
foo.next();//返回值是是一个对象{value:0,done:false}当调用next后,会执行yield后面的语句。
foo.next();//{value:1;done:false}next()其实是单步执行,一步一步的打印,done指的是是否执行完成;返回的是迭代器对象,
foo.next()//{value:1;done:false}
foo.next()//{value:undefined;done:true};
function* gen(args){
args.forEach(item=>{
 //**注意这里不能写yield,因为这个是forEah函数里面***
})}
function *gen(x){
   let y=2*(yield(x+1)) //5+1=6
   let z=yield(y/3)
   return x+y+z
}
let g=gen(5)
g.next();//第一次传参是上面的5,然后执行的是yield后面的值执行返回值是:*****{value:6,done:false}
g.next();//next参数是上一条yield的返回值,这里没有传参就是undefined *2,y就是NaN;NaN/3就是NaN.第二次调用接着上一次继续调用,来到下一个yield.,
g.next();//从yield(y/3)开始执行,执行下一句,还是NaN
案例传参:
function *gen(x){
   let y=2*(yield(x+1)) //5+1=6
   let z=yield(y/3)
   return x+y+z
}
let g=gen(5)//
g.next();//6
g.next(12);//传递参数代表上一次传递的参数12,也就是yield(x+1)整个返回值代表了12了,y=2*12=24;执行下一句,24/3=8;//注意next()执行时yield后面的语句结束。
g.next(13);//相当于上一次的z=yield(y/3)=13;,x=5,y=24
function* count(x=1){
 while(true){
if(x%7===0){
yield x
}
x++;//下一轮
}
}
let n=count();
console.log(n.next().value) //从对象返回值中拿到value值7
console.log(n.next().value) //从对象返回值中拿到value值14
console.log(n.next().value) //从对象返回值中拿到value值21
可以拿到7的倍数,否则就会导致死循环

//使用generator执行异步读取文件
function ajax(url,callback){
var xmlhttp;
if(window.XMLHttpRequest){
 xmlhttp=new XMLHttpRequest()
}else{

}
xmlhttp.open('GET',url,true)
xmlhttp.send();
xmlhttp.onreadystatechange=function(){
 if(xmlhttp.readyState===4 &&xmlhttp.status==200 ){
 var obj=JSON.parse(xmlhttp.responseText)
 callback(obj)
 }
}
}
function request(url){
ajax(url,res=>{
getData.next(res)
})
}
function *gen(){
let res1=yield request('static/a.json') //首次调用gen ,执行yield,里面调用了request,ajax结束以后,又回调了getData(),再次执行yield第二部步,就这样执行到了最后
console.log(res1);
let res2=yield request('static/b.json')

let res3=yield request('static/c.json')
}
let getData=gen()
getData.next()

for(let item of getData){
    console.log(item)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值