js-generator基础
Posted fahuibuguangfan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js-generator基础相关的知识,希望对你有一定的参考价值。
js-generator基础(第四周)
看了几个小时generator相关文章,发现里面东西太多,这周想放弃写这篇,转写其他方面的,上次就用了这招,不过没有没有找到其他可写的,最后决定写一篇相当基础的generator
generator是什么
- generator也是为了解决地狱回调问题的,和上周的promise一样都是为了实现异步编程,本质还是各种回调;
在某些时候也可以认为generator为es6中新定义的数据类型,这种数据类型和函数很像,每个函数只能返回一个结果,即只能return一次,如果在某些函数中没有看到return,其实质在函数结尾是存在一个隐藏的return undefined 的,而generator不同,可以返回多次
实现异步编程的原理
- 通过协程方式,协程就是多个线程相互协作,完成异步任务,如下图:
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);
结果:
可以看出generator 遇到yleld就会暂停,只有当调用generator.next()才会向下执行,调用这个方法会返回{value: x, done: true/false},这个对象中value是yield的返回值,done表示generator是否执行结束,只有当执行到return时,这个对象中的done才会变成true,说明执行结束;如果仍然执行的话,如上图后两条,执行到done为true时就不要执行了
<完>
20180816
发挥不广泛
以上是关于js-generator基础的主要内容,如果未能解决你的问题,请参考以下文章
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础