语法 function* functionName(),yield
//普通函数
// function foo(){
// for(let i=0;i<3;i++){
// console.log(i);
// }
// }
// foo()
//生成器函数 Generator函数 不能做为构造函数使用
function* foo(){
for(let i=0;i<3;i++){
yield i //yield只能直接在generator中使用
}
}
let f = foo()
//一步步手动进行 每次执行yield后面的代码
console.log(f.next()); //{value: 0, done: false}
console.log(f.next()); //{value: 1, done: false}
console.log(f.next()); //{value: 2, done: false}
console.log(f.next()); //{value: undefined, done: true}
使用方法
function* gen(x){
let y=2*(yield(x+1))
let z=yield(y/3)
return x+y+z
}
let g = gen(5)
// console.log(g.next()); //{value: 6, done: false} 5+1=6
// console.log(g.next()); //{value: NaN, done: false} 没传参2*undefined
// console.log(g.next()); //{value: NaN, done: true} NaN/3
console.log(g.next()); //{value: 6, done: false} 5+1=6
console.log(g.next(12)); //{value: 8, done: false} 2*12=24 24/3=8
console.log(g.next(13)); //{value: 42, done: true} z=13 5+24+13=42
使用场景
//7或7的倍数
function* count(x=1){
while(true){
if(x % 7 ===0){
yield x
}
x++
}
}
let n=count()
console.log(n.next().value); //7
console.log(n.next().value); //14
console.log(n.next().value); //21
console.log(n.next().value); //28
console.log(n.next().value); //35
解决callback hell
// function ajax(url,callback){...}
function request(url){
ajax(url,res=>{
getData.next(res)
})
}
function* gen(){
let res1=yield request('static/a.json')
console.log(res1);
let res2=yield request('static/b.json')
console.log(res2);
let res3=yield request('static/c.json')
console.log(res3);
}
let getData=gen()
getData.next()
网友评论