博舍

Generator生成器 petpet generator生成器怎么用

Generator生成器

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

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

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

function*generatorF(){yield1;yield2;yield3;}letgenerator=generatorF();//返回的generator是一个迭代器console.log(generator.next().value);//1console.log(generator.next().value);//2console.log(generator.next().value);//3console.log(generator.next().done);//frue//next可以接收一个参数作为上一次yield的返回值。next不传参时,yield表达式本身是没有返回值的,例如varx=yield3;x会等于undefined,但不影响next方法有返回值{value:3;done:false}。由于参数表示的是上一个yield,所以第一次next传参是无效的。function*foo(x){vary=2*(yield(x+1));varz=yield(y/3);return(x+y+z);}varb=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和拓展运算符letobj={"0":"aa","l":"bb","2":"cc"}obj[Symbol.iterator]=function*(){for(letkeyinthis){letval=this[key];yieldval;}}for(letiofobj){console.log(i)}//aa//cc//bb//Generator异步操作的同步化表达function*getDate(){vardatal=yieldrequest(datal.id);vardata2=yieldrequest(data2.id);vardata3=yieldrequest(data3.id);}vargetd=getDate();getd.next();

//request为接口请求,该代码勿直接运行

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇