当前位置 博文首页 > 纸飞机博客:Generator生成器

    纸飞机博客:Generator生成器

    作者:[db:作者] 时间:2021-09-07 10:06

    Generator函数是ES6提供的一种异步编程解决方案。Generator函数是一个状态机, 使用yield表达式定义了多个内部状态。同时还是一个迭代器对象(Iterator)的生成函数,返回的迭代器对象利用next方法可以依次遍历Generator函数内部的每一个状态。

    语法:function* + yield, function关键字与函数名之间有一个星号(位置靠任一方均可)。

    执行机制:调用Generator函数后,函数并不执行,而是返回一个迭代器。当该迭代器第一次调用next方法时,函数从头开始执行 , 内部指针从函数头部指向第一个yield语句,函数执行到该yield语句之后自动暂停,yield后面表达式的值会作为next方法的返回值中的value值。当迭代器再次调用next方法时才会从上次停止的地方 (yield [表达式]处的后面)开始继续执行, 直到执行完下一句yield语句,或return语句为止。

    function *generatorF(){
        yield 1;
        yield 2;
        yield 3;
    }
    let generator = generatorF();
    //返回的genera tor是一个迭代器
    console.log(generator.next().value);//1
    console.log(generator.next().value); //2
    console.log(generator.next().value); //3
    console.log(generator.next().done);//frue
    //next可以接收一个参数作为上一次yield的返回值。next不传参时,yield表达式本身是没有返回值的,例如 var x = yield 3 ;x会等于undefined,但不影响next方法有返回值{value:3;done:false}。由于参数表示的是上一个yield,所以第一次next传参是无效的。
    function* foo(x) {
        var y = 2 * (yield (x + 1));
        var z = yield (y/3);
        return (x + y + z);
    }
    var b = foo(5);
    b.next() //{value:6, done:false}
    b.next(12) //{value:8, done: false}
    b.next(13) //{value:42, done:true}
    // 5+24+13
    //Generator函数就是迭代器Iterator生成函数 , 可以把Generator赋值给对象的Symbol.iterator属性,从而使得普通对象具有Iterator接口,成为可迭代对象,能够使用forof和拓展运算符
    let obj = {
        "0":"aa",
        "l":"bb",
        "2":"cc"
    }
    obj[Symbol.iterator] = function *(){
        for(let key in this){
            let val = this[key];
            yield val;
        }
    }
    for( let i of obj){
        console.log(i)
    }
    //aa
    //cc
    //bb
    // Generator异步操作的同步化表达
    function *getDate() {
        var datal = yield request(datal.id);
        var data2 = yield request(data2.id);
        var data3 = yield request(data3.id);
    }
    var getd = getDate();
    getd.next();
    
    //request为接口请求,该代码勿直接运行
    cs
    下一篇:没有了