呃,今天学了generator,拿出来作个标记。node
这个词在node.js里的作用是为了作异步操做,generator实际上就是promise的语法糖,什么叫语法糖呢,就是....本身度娘吧。。数据库
个人我的理解,异步操做就是程序执行到generator的yield标记的语句时,暂时暂停当前程序的执行,而后把被标记的代码执行完,到返回结果的时候当前程序再继续执行,这样就能够在被标记语句的下一行代码里使用被标记语句获得的结果。主要用于不肯定执行时长的语句,好比:读取数据库,读取文件等。promise
看代码:异步
'use strict'; function * aa(){ yield 'aa'; } let a = aa(); console.log(a.next().value);//aa
generator函数的写法就是在function 和函数名以前要有一个星号(*),星号左右最少有一个空格,能够是贴着function关键字,也能够是贴着函数名,固然两边都有空格也是能够的,而后在函数体里,有须要作异步操做的语句前加上yield,之前看别人的贴子的时候,要么只有代码,要么就一两句解释,我这人悟性不够,每每看不懂,这里讲的虽然啰嗦,但更容易懂是吧,下面来一行一行的解释一下这段代码是什么意思:ide
首先,定义了一个generator函数aa,函数
函数体里有须要作异步操做的语句'aa',用yield标记,指针
而后声明一个变量a指向aa()返回的遍历器,对,你没看错,在 let a=aa();这句的时候aa()方法尚未执行,a在这时候只是获得aa()的一个遍历器,generator
而后下一句输出a.next().value,这句的意思是什么?在这以前须要先说明一点。generator函数的执行方式是先生成一个遍历器,而后有一个指针指向最开始执行处,而后函数体中的每个yield就是一个节点,想往下执行,就只能用遍历器的next()方法去指向下一个yield直到结束,这一句的意思就是执行yield 'aa';这句代码,本文写的例子很简单,yield 'aa'你能够写成 yield 读取文件;it
而后等这句执行完会把结果返回给指针,能够用 next().value取出这个yield标记的代码执行的结果。io
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()函数体返回。
恩。那后面的三行输出语句我想就应该不用再多说了,,