Generator函数——ES6异步编程

1.Generator函数详解

作用:1.延迟执行的异步函数;2.与Symbol.iterator的关系;3.状态机

定义一个Generator函数

function* myGenerator(){

    console.log('开始');

    let res = yield "暂停一";
    console.log(res);

    console.log('继续');

    yield "暂停二";

    console.log('继续二');

    return '结束';
}
//调用Generator函数并不是马上开始执行代码,而是返回一个执行方法的指针
myGenerator();//不能直接调用
let point = myGenerator();
//让Generator函数启动
point.next();

/*

让Generator函数启动,碰到yield语句的时候就暂停了,
yield语句,会将一个对象->{value:'暂停一',done:false},会作为next函数的返回值
    value:表示yield的值或return表达式的结果
    done:表示是否结束

*/
console.log(point.next());//{value:'暂停一',done:false}
console.log(point.next());//{value:'暂停二',done:false}

//第一句next语句传入的参数是没有意义的,因为它有口饭吃的是函数,不是uield语句
console.log(point.next('hello'));
console.log(point.next('world'));//打印world

2.Generator函数案例

1.通过Generator函数来部署iterator接口

let obj = {
    name:'tom',
    age:19,
    sex:'man'
}
//手动部署iterator接口
//所有能够使用for of 遍历的对象,iterator接口都部署在symbol.iterator属性
obj[Symbol.iterator] = function*(){
    /*yield 1;
    yield 2;
    yield 3;*/
    for(let key of obj){
        yield obj[key]
    }
}
for(let value of obj){
    console.log(value)
}

2.页面的砸金蛋,限定砸金蛋的次数

//定义一个砸金蛋的Generator函数
function* hitEgg(count){
    while(count>0){
        count--;
        yield console.log(`砸金蛋了!还可以砸${ocunt}次!`);
    }
}

//从服务器获取剩余次数,传入Generator函数
let draw = hitEgg(5);

$(function(){
    $('#btn').click(() => {
        draw.next();
    })
})

3.Generator函数发送异步请求

先获取商品详情,在获取商品评论

总结:使用Generator函数发送异步请求:
1.逻辑清晰
2.避免了’回调地狱;
3.可以灵活的控制各个请求发送的时机

function* getGoods(){
    //先获取商品详情页
    let commentsUrl = yeild getData('http://localhoset:3000/goos_detail?id=2');
    //再获取商品评论内容
    yield getData(commentsUrl);
}
function getData(url){
    $.get(url,(data) => {
        console.log(data);
        //第二次调用next,将商品评论的url传入下一次的yield
        geneGood.next(`http://localhoset:3000${data.commentsUrl}`);

    },'json')
}
let geneGood = getGoods();
// 第一次调用next函数,发送请求商品详情的ajax
geneGood.next();
原文地址:https://www.cnblogs.com/lisa2544/p/15660820.html