Generator 函数的语法

一、简介

Generator函数是es6提供的一种异步编程解决方案。
语法上:首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态,
执行Generator函数会返回一个遍历器对象,即Generator还是一个遍历器对象生成函数。返回的遍历器对象,可以依次的遍历Generator函数内部的每一个状态。
形式上:Generator函数是一个普通的函数,但是有两个特征:
    1、function关键字与函数名之间有一个星号
    2:函数体内部使用yield表达式,定义不同内部状态

  function* helloGenerator(){
    yield 'hello';
    yield 'word'
    return "ending"
  }
   var hg = helloGenerator();
       //done为true,表示遍历已经结束
       console.log(hg) //helloGenerator {}
       console.log(hg.next()) // {value: "hello", done: false}
       console.log(hg.next()) // {value: "world", done: false}
       console.log(hg.next()) // {value: "ending", done: true} 
       console.log(hg.next()) // {value: undefined, done: true}

分析:
1:调用Generator函数后,改函数并不执行,返回的也不是内部函数运行结果,而是一个指向内部状态的指针对象(即:遍历器对象)
2:必须调用遍历器对象的next方法,使指针移向下一个状态。即:每次调用next方法后,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式或者return语句。
换言之:Generator函数是分段执行的,yield表达式是暂停执行的标记,next方法是恢复执行。

二、yield表达式

yield是Generator函数的暂停标志。
遍历器对象的next方法的运行逻辑如下:
1:遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的表达式的值作为返回的对象的value的属性值
2、下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式
3、如果没有再遇到yield,就一直运行到函数结束,直到return语句为值,并将return语句的值作为返回对象的value值。
4、如果该函数没有return语句,则返回的对象的value值为undefined
yield表达式只能用在Generator函数里面,用在其他地方都会报错

三、next方法的参数

yield表达式本身没有返回值,或者说总是返回undefined,next方法可以带一个参数,这个参数会被当做上一个yield表达式的返回值

四、for…of循环

	function* foo() {
	  yield 1;
	  yield 2;
	  yield 3;
	  yield 4;
	  yield 5;
	  return 6;
	}
	
	for (let v of foo()) {
	  console.log(v);
	}
	// 1 2 3 4 5

一旦next方法的返回对象的done属性为true,for…of循环就会中止,且不包含该返回对象,所以上面代码的return语句返回的6,不包括在for…of循环之中

五、协程

a、传统的子例程:传统的子例程采用堆栈式“后进先出”的执行方式,只用当调用的子函数完全执行完毕,才会结束执行父函数。
b、协程:可以并行执行、交换执行权的线程(或函数),就称为协程(即:多个线程互相协作,完成异步任务),协程是同时存在多个栈,但只有一个栈是在运行状态,也就是说,协程是以多占用内存为代价,实现多任务的并行

六、Generator作用

1、异步操作的同步化表达
2、控制流管理
3、部署 Iterator 接口
4、作为数据结构

七、Generator异步应用

1、传统方法:es6诞生以前。异步编程的方法大概有四种

1、回调函数-----缺点:出现回调函数地狱
2、事件监听
3、发布/订阅
4、Promise对象 :解决回调函数地狱,Promise不是新的语法功能,而是一种新的写法,将回调函数嵌套改成链式调用,缺点:代码冗余,不管什么操作一眼看去据说一堆then,使原来的语义变得不清楚

2:异步:简单说就是一个任务不是连续完成的,可以理解成该任务被人为分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段

3、协程的 Generator 函数实现
Generator 函数就是一个封装的异步任务,或者说是异步任务的容器。异步操作需要暂停的地方,都用yield语句注明

你可能感兴趣的:(es6,Generator)