js-generator基础

js-generator基础(第四周)


看了几个小时generator相关文章,发现里面东西太多,这周想放弃写这篇,转写其他方面的,上次就用了这招,不过没有没有找到其他可写的,最后决定写一篇相当基础的generator


 

generator是什么

  • generator也是为了解决地狱回调问题的,和上周的promise一样都是为了实现异步编程,本质还是各种回调;
    在某些时候也可以认为generator为es6中新定义的数据类型,这种数据类型和函数很像,每个函数只能返回一个结果,即只能return一次,如果在某些函数中没有看到return,其实质在函数结尾是存在一个隐藏的return undefined 的,而generator不同,可以返回多次

 

实现异步编程的原理

  • 通过协程方式,协程就是多个线程相互协作,完成异步任务,如下图:
    image.png

 

generator的使用

generator用 function*,比普通函数多出一个“ * ”,generator除了return语句外,可以用yield返回多次,也可以看成generator遇到yield是就返回一个值,并且generator暂停在这,当需要继续执行是只用调用generator.next()就可以继续执行,遇到yield又会暂停,再调用generator.next()后继续执行……

 

 function* gen(){ yield 1; yield 2; yield 3; yield 4; yield 5; return "结束"; } let g = gen(); let i = 0; let st = setInterval(() => {//每间隔500ms执行一次g.next(),执行7次,并在控制台打印 i++; console.log(g.next()); if(i>7){ clearInterval(st); } }, 500); 

结果:
generator1.gif
可以看出generator 遇到yleld就会暂停,只有当调用generator.next()才会向下执行,调用这个方法会返回{value: x, done: true/false},这个对象中value是yield的返回值,done表示generator是否执行结束,只有当执行到return时,这个对象中的done才会变成true,说明执行结束;如果仍然执行的话,如上图后两条,执行到done为true时就不要执行了
<完>
20180816
8cm.jpg
发挥不广泛

猜你喜欢

转载自www.cnblogs.com/fahuibuguangfan/p/9508951.html