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)
}