Generator生成器

Posted 纸 飞机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Generator生成器相关的知识,希望对你有一定的参考价值。

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为接口请求,该代码勿直接运行

以上是关于Generator生成器的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis使用Generator自动生成代码

mybatis自定义代码生成器(Generator)——自动生成model&dao代码

mybatis代码生成器——MyBatis Generator

Mybatis代码生成器Mybatis-Generator使用详解

开源代码生成器,基于mybatis-generator扩展,结合freemarker

代码生成平台Xxl-Code-Generator