7、ES6-生成器Generator和迭代器Iterator的实现原理

今天我们要简单讲解下生成器Generator和迭代器Iterator的实现原理,这是实现koa的基础,也是实现异步解决方案async await的基础。
在这里,讲解原理的前提是你必须知道生成器Generator和迭代器Iterator是用来干什么的,可以自行搜CSDN相关文章阅读,在这里不做赘述。

生成器Generator的实现原理

1、简易生成器实现

首先,我们用一小段代码来实现一个简易的generator。

  • 首先,我们需要封装一个方法,取名为read,接收一个参数,举例为接收数组
  • 接着,我们需要名阿比generator最关键的部分是调用next()方法,所以,我们在read中需要返回一个对象,其中的key和value就是next方法。
  • 最后,我们需要明白,next方法调用的结果是产生一个对象,该对象中有两个内容,分别为value和done,对应的值为传入数组的元素和是否已经结束的boolean值。
function read(books){
     let index = 0;
     return {
         next(){
	         //只要能取到就为false,取不到为true
             let done = (index ===  books.length);
             let value = done?undefined:books[index++];
             return {value,done}
         }
     }
 }
 //迭代器
 let it = read(['js','node']);
 //it有一个方法叫做next,每次调用next都会返回一个结果——{value,done}
 do{
    result = it.next();
    console.log(result);
} while (!result.done);

read生成器,用来生成迭代器的,第一个return后面的就是迭代器
迭代器的作用:可以不停地调用next(),得到一个结果{value,done}
当done为true的时候,就表示取完了。

2、生成器函数与普通函数的区别

详见代码注释

/*
生成器函数与普通函数的区别:
         1、生成器函数跟普通函数长相不一样
             function* read(){}
             function *read(){}
             function * read(){}
             以上三种均可
         2、执行的时候也不一样
             当调用next方法时,需要通过yield关键字产出yield后面的结果,并停止该函数执行
             当再次调用next方法时,才会继续从上一个yield后面执行,到下一个yield产出为止
             
             yeild后面的内容,是产出的结果{value,done}中value的值
         3、生成器函数其实是内部生成了很多个小函数

 */
 function *read(books){
     for(let i = 0;i

你可能感兴趣的:(前端,ES6,es6,实现原理,迭代器,生成器)