当前位置: 首页 > 科技观察

本文将带你了解JavaScript的Generator功能

时间:2023-03-19 02:26:45 科技观察

大家好,我是进阶学习者。1.概念一个常规函数只会返回一个值(或不返回任何值)。另一方面,生成器可以根据需要一个接一个地返回(“yield”)多个值。它们与iterable完美配合,可以轻松创建数据流。2.生成器函数要创建一个生成器,需要一个特殊的语法结构:function*,即所谓的“生成器函数”。生成器函数的行为不同于常规函数。调用此类函数时,它不会运行其代码。相反,返回一个称为“生成器对象”的特殊对象来管理执行流程。例如,您可以创建一个生成器并获取它的第一个生成值:);//{value:1,done:false}到目前为止,只得到了第一个值,现在函数执行在第二行:让我们再次调用generator.next()。代码恢复执行并返回下一个yield的值:第三次,代码会执行到return语句,此时这个函数执行完毕:letthree=generator.next();alert(JSON.stringify(three));//{value:3、done:true}运行结果:三、Generator是iterable当你看到next()方法时,或许你已经猜到了generator是可迭代的(iterable)。(注解:next()是iterator的必备方法)可以用for..of循环遍历它的所有值:function*generateSequence(){yield1;yield2;return3;}letgenerator=generateSequence();for(letvalueofgenerator){alert(value);//1,then2}运行结果:for..of看起来是不是比.next().value更优雅?注意:上面的例子会先显示1,然后显示2,然后就没有了。它不会显示3!这是因为for..of循环在完成时忽略了最后一个值:true。因此,如果你想通过一个for..of循环显示所有的结果,你必须使用yield来返回它们:function*generateSequence(){yield1;yield2;yield3;}letgenerator=generateSequence();for(letvalueofgenerator){alert(value);//1,then2,then3}因为生成器是可迭代的,所以iterator的相关函数都可以使用。例如:传播语法...:function*generateSequence(){yield1;yield2;yield3;}letsequence=[0,...generateSequence()];alert(sequence);//0,1,2,3操作结果:4.GeneratorComposition生成器组合(composition)是生成器的一个特殊功能,它允许透明地(transparently)将生成器“嵌入(embed)”在一起。例如,有一个生成数字序列的函数:组合生成器的一个例子:function*generateSequence(start,end){for(leti=start;i<=end;i++)yieldi;}function*generatePasswordCodes(){//0..9yield*generateSequence(48,57);//A..Zyield*generateSequence(65,90);//a..zyield*generateSequence(97,122);}letstr='';for(letcodeofgeneratePasswordCodes()){str+=String.fromCharCode(code);}alert(str);//0..9A..Za..z运行结果:generator.throw如上例观察,外部代码可能通过作为yield的结果,生成器的一个值。但它也可以在那里引发(抛出)错误。这是自然的。由于错误本身就是一个结果,要将错误传递给yield,应该调用generator.throw(err)。这样的话,err就会被抛到对应的yield所在的行。示例:“2+2?”的收益率导致错误:function*gen(){try{letresult=yield"2+2=?";//(1)alert("执行不到这里,因为上面抛出了异常");}catch(e){alert(e);//显示这个错误}}letgenerator=gen();letquestion=generator.next().value;generator.throw(newError("Theanswerisnotfoundinmydatabase"));//(2)运行结果:五、总结本文以JavaScript为基础,介绍Generator功能,重点介绍如何组合Generators,采用图文结合的方式。使用JavaScript语言,可以更直观的理解,希望能帮助读者更好的学习。欢迎大家积极尝试。有时候看别人实现很简单,但是到了自己实现的时候,总会出现各种各样的问题。不要野心太大,努力理解得更深刻。代码很简单,希望对大家学习有所帮助。