呃,今天学了generator,拿出来做个标记。

这个词在node.js里的做用是为了做异步操作,generator实际上就是promise的语法糖,什么叫语法糖呢,就是....自己度娘吧。。

我的个人理解,异步操作就是程序执行到generator的yield标记的语句时,暂时暂停当前程序的执行,然后把被标记的代码执行完,到返回结果的时候当前程序再继续执行,这样就可以在被标记语句的下一行代码里使用被标记语句得到的结果。主要用于不确定执行时长的语句,比如:读取数据库,读取文件等。

看代码:

'use strict';

function * aa(){
	yield 'aa';
}

let a = aa();
console.log(a.next().value);//aa

generator函数的写法就是在function 和函数名之前要有一个星号(*),星号左右最少有一个空格,可以是贴着function关键字,也可以是贴着函数名,当然两边都有空格也是可以的,然后在函数体里,有需要做异步操作的语句前加上yield,以前看别人的贴子的时候,要么只有代码,要么就一两句解释,我这人悟性不够,往往看不懂,这里讲的虽然啰嗦,但更容易懂是吧,下面来一行一行的解释一下这段代码是什么意思:

首先,定义了一个generator函数aa,

函数体里有需要做异步操作的语句'aa',用yield标记,

然后声明一个变量a指向aa()返回的遍历器,对,你没看错,在 let a=aa();这句的时候aa()方法还没有执行,a在这时候只是得到aa()的一个遍历器,

然后下一句输出a.next().value,这句的意思是什么?在这之前需要先说明一点。generator函数的执行方式是先生成一个遍历器,然后有一个指针指向最开始执行处,然后函数体中的每一个yield就是一个节点,想往下执行,就只能用遍历器的next()方法去指向下一个yield直到结束,这一句的意思就是执行yield 'aa';这句代码,本文写的例子很简单,yield 'aa'你可以写成  yield 读取文件;

然后等这句执行完会把结果返回给指针,可以用 next().value取出这个yield标记的代码执行的结果。


generator函数可以嵌套:

'use strict';

function * aa(){
	yield 'aa';
}

let test = function* (){
	yield 'hello';
	yield* aa();
	yield 'ok';
}

let test1 = test();
console.log(test1.next().value);//'hello'
console.log(test1.next().value);//'aa'
console.log(test1.next().value);//'ok'

这段代码和上面代码唯一的不同是中间嵌套了一个generator函数

yield* aa();

那有些童鞋就会问了,为什么不直接写 aa();?那是因为上文说了,aa()这样直接调用generator函数,函数体是不会执行的,只会返回一个遍历器,函数体都还没执行,当然没有结果。

那又有些童鞋会问,其他的yield 后不是都没有星号么?为什么这个有星号?这个问题问的好,不加星号的话,直接yield aa(),实际上是和直接调用aa()是一样的,为什么,yield只是一个标记,去执行被标记的代码,那和直接调用aa()有什么区别呢?但加了星号就不一样了,他会等aa()函数体返回。

恩。那后面的三行输出语句我想就应该不用再多说了,,