什么是迭代器?迭代器是浏览器方便遍历规则对象的特殊函数。正确的!它是一个函数。暂且不论这个功能是如何实现的,相信大家对下面这段代码并不陌生:arr之所以能够通过forofof依次打印出a站和b站,是因为数组原型链中包含了这样一个迭代器函数,我们使用特殊类型的Symbol.iterator获取以下内容:[nativecode]表示浏览其原生实现,已编译为处理器特定的机器码代码,并经过优化以高效运行。可以看出数组和原型链都包含名为values的函数。可以发现数组arr的迭代器函数正好等于Array原型链上的迭代器函数。研究过原型链的继承的同学往往会明白。巧合的是,在ES6新加入的Map和Set对象中都有迭代器的影子,我们也可以使用forof函数来迭代它们的实例:自然,它们也有自己的迭代器功能:用展开运算符(...)使用,请注意打印内容:可见,如果一个对象包含迭代器函数(iterator),那么它就是一个可迭代对象,可以使用forofor...扩展操作符。forof是如何逐个元素获取的?答案是通过调用next方法来调用iterator函数返回的实例(对象)的next方法:每调用一次next,就得到一个值。当获取到的done状态为true时,如何在调用结束时自己实现一个可迭代对象呢??请看代码:关键1:迭代器函数必须返回一个包含下一个属性的对象。关键2:下一个属性是一个方法,必须返回一个对象{value:'value',done:true/false}。value表示每次迭代返回的值,done判断迭代是否结束。如果done始终为真,那么迭代将永远不会停止。什么是发电机?Generator是由符合Iterable和Iterator协议的生成器函数返回的对象。generatorfunction函数就是在普通函数名前加一个*号,函数内部使用yeild关键字定义函数断点,使函数从上到下批量执行并返回一个值。既然myGenerator实例可以使用forof进行迭代,那他有没有像Array数组一样的迭代器函数呢?我们用[Symbol.iterator]属性来看一下:不出所料,生成器函数生成的生成器对象也有一个可迭代函数。使用Generator改造iterableObj改造前:改造后:使用generator让异步代码像同步代码一样执行Promise,让程序员告别痛苦的回调地狱,这样写异步代码:编码还是舒服的,但还有更舒服的姿势:函数写好了,但是如何调用*getData()函数呢?一起来看看吧。我们发现在迭代调用next()函数时,返回的值是一个promise,并不是执行后想要的1、2、3,所以我们可以调用then方法获取断言后的值。看下面的代码:在代码中,我们使用了promise链调用的方式来保证在上一个请求完成后进行下一个next调用。需要注意的是,第一次打印value1后,下次调用next时,需要将value1作为参数,否则会得到DataAundefined。细心的朋友注意到,yield关键字在getData生成器函数中出现了3次,但是next被调用了4次。为什么一个产量不对应一个产量?产量就像绳子上的一个结。一根绳子只打了一个结就分成两半,左半部分和右半部分。已知一根绳子上有3个结,请问绳子分成几部分?体育老师教过的同学都知道是4,generator调用其实就是按照规律执行next方法,把上次执行的结果作为next函数的参数。然后封装一个函数自动执行generator实例,而不是写一堆代码挨着调用next。如何让生成器自动执行,如何封装?封装一个函数,将生成器函数getData作为参数,递归调用next方法。请看简要代码:其实大名鼎鼎的co库早期也采用了类似的方法。当然co框架也考虑了其他很复杂的情况,比如异常错误。异步等待就在这里。asyncawait的语法糖是方便异步编程像同步编程一样写代码。不用co库,只需要在函数前面加上async标志代表生成器函数,用await代替yield关键字。无需考虑生成器实例如何调用next方法。闻起来真香!总结:我们了解了迭代器的基本概念,知道Array、Map、Set在原型链中都有迭代器,可以通过[Symbol.iterator]访问。知道迭代器对象的特点,里面包含next方法,方法必须返回value和done属性。最后给一个普通的{}对象加上一个自己实现的迭代器,这样就可以通过forof迭代来执行了。生成器是es6中新引入的对象。它不能直接实例化。需要通过生成器函数返回(在函数名前加*)。iterator迭代对象像generator实例一样使用next方法进行迭代。最后通过Genetator的新语法重写迭代器,达到forof遍历的目的。类似于co模块的自封装函数,让迭代器自动执行,使得同步编写异步代码成为可能。es7中async和await的语法糖使得编写异步方法更加简洁和容易。上一篇:微信小程序开发经验总结,UI组件、图表、自定义栏都搞定了。请不要忘记给我点赞、评论和收藏。请!
