异步编程解决方案Generator

2021-03-18  本文已影响0人  大吉的罐头
语法 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()
上一篇 下一篇

猜你喜欢

热点阅读