生成器主要功能Genrator分析:通过一个程序,不断迭代或枚举有序序列中符合某种公式或算法的元素。在js中的具体表现形式是function*。通过生成器可以实现按需采集。如何理解,比如我们要获取一定数量的斐波那契,可以使用下面的方法;函数*fibo(){让a=0;让b=1;产量;产量b;while(true){让next=a+b;一=乙;b=下一个;接下来屈服;}}letgenerator=fibo();for(leti=0;i<10;i++){process.stdout.write(generator.next().value+"");}console.log(".")//0112358132134。上面的特殊点是yield,它和return类似,但不是退出函数体,而是切出函数Runtime。切出的过程类似于从协程中取出一个值;同时,经过一系列sync或async操作后,主线程可以通过generator的next方法与之通信,恢复协程的执行。随意创建一个生成器,通过其原型链可以看出生成器主要有以下方法generator.next(value)获取下一个生成器切出状态(第一次执行时的第一个切出状态)generator.throw(error)返回执行对象给当前生成器并抛出错误,终止生成器,除非捕获异常generator[Symbol.iterator]为生成器提供可迭代的方法(可通过for-of语句获得)generator.return返回一个给定的值,最后遍历Generator函数是最先使用的方法。generator的主要应用场景(现阶段感觉只有以下两种用途)用同步的方式表达异步操作,解决金字塔回调问题。beforelikethis//普通版本函数echo(content,cb){cb(null,content);}functionrun(){echo('hello',(...rest0)=>{console.log(rest0[1]+"world");});}跑步();//helloworldgenerator等价的写法//thunkversionfunctionecho(content){returncb=>{cb(null,content);//generator作为逻辑体,主线程执行异步方法}}functionrun(genFn){constgen=genFn();constnext=value=>{constret=gen.next(value);如果(ret.done)返回;ret.value((err,val)=>{//异步任务if(err)returnconsole.error(err);next(val);//递归});}next();}run(function*(){constmsg0=yieldecho('hello');constmsg1=yieldecho(`${msg0}world`);console.log(msg1);//helloworld});说明上面的写法虽然简单,但是很多变种库都有影子,比如co,koa1等等。在对象上部署Iterator接口,使其可遍历function*setIterator(obj){letkeys=Object.keys(obj);for(leti=0,len=keys.length;i
