作者:手机用户2602903375 | 来源:互联网 | 2024-10-26 19:06
本文详细解析了Node.jsv4中的Generator函数,探讨了其核心概念与多重理解视角。从语法层面来看,Generator函数可被视为一种状态机,能够封装多个内部状态。执行Generator函数时,它不会立即运行函数体内的代码,而是返回一个迭代器对象,通过该迭代器可以逐步控制函数的执行流程,实现异步操作的同步化处理。此外,文章还提供了实用的应用实例,帮助开发者更好地理解和运用这一功能强大的特性。
1、Generator简介
基本概念
Generator
函数有多种明白角度。从语法上,起首能够把它明白成,Generator
函数是一个状况机,封装了多个内部状况。
实行Generator
函数会返回一个遍历器对象,也就是说,Generator
函数除了状况机,照样一个遍历器对象天生函数。返回的遍历器对象,能够顺次遍历Generator
函数内部的每个状况。
形式上,Generator
函数是一个一般函数,但是有两个特性。一是,function
敕令与函数名之间有一个星号;二是,函数体内部运用yield
语句,定义差别的内部状况(yield
语句在英语里的意义就是“产出”)。
'use strict';
function * helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
let hw = helloWorldGenerator();
上面代码定义了一个Generator
函数helloWorldGenerator
,它内部有两个yield
语句“hello”
和“world”
,即该函数有三个状况:hello
,world
和return
语句(终了实行)。
然后,Generator
函数的挪用要领与一般函数一样,也是在函数名背面加上一对圆括号。差别的是,挪用Generator
函数后,该函数并不实行,返回的也不是函数运转结果,而是一个指向内部状况的指针对象,遍历器对象(Iterator Object
)。
2、next要领
挪用遍历器对象的next
要领,使得指针移向下一个状况。也就是说,每次挪用next
要领,内部指针就从函数头部或上一次停下来的处所最先实行,直到碰到下一个yield
语句(或return
语句)为止。换言之,Generator
函数是分段实行的,yield
语句是停息实行的标记,而next
要领能够恢复实行。
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
上面代码一共挪用了四次next
要领。
第一次挪用,Generator
函数最先实行,直到碰到第一个yield
语句为止。next
要领返回一个对象,它的value
属性就是当前yield
语句的值hello
,done
属性的值false
,示意遍历还没有终了。
第二次挪用,Generator
函数从上次yield
语句停下的处所,一向实行到下一个yield
语句。next
要领返回的对象的value
属性就是当前yield
语句的值world
,done
属性的值false
,示意遍历还没有终了。
第三次挪用,Generator
函数从上次yield
语句停下的处所,一向实行到return
语句(假如没有return
语句,就实行到函数终了)。next
要领返回的对象的value
属性,就是紧跟在return
语句背面的表达式的值(假如没有return
语句,则value
属性的值为undefined
),done
属性的值true
,示意遍历已终了。
第四次挪用,此时Generator
函数已运转终了,next
要领返回对象的value
属性为undefined
,done
属性为true
。今后再挪用next
要领,返回的都是这个值。
总结一下,挪用Generator
函数,返回一个遍历器对象,代表Generator
函数的内部指针。今后,每次挪用遍历器对象的next
要领,就会返回一个有着value
和done
两个属性的对象。value
属性示意当前的内部状况的值,是yield
语句背面谁人表达式的值;done
属性是一个布尔值,示意是不是遍历终了。
3、yield*语句
用来在一个Generator
函数内里实行另一个Generator
函数,我们需要用yield*
语句。
假如yield
敕令背面跟的是一个遍历器对象,需要在yield
敕令背面加上星号,表明它返回的是一个遍历器对象。这被称为yield*
语句。
'use strict';
function *anotherGenerator(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function *generator(i) {
yield i;
yield *anotherGenerator(i);
yield i + 10;
}
let gen = generator(10);
console.log(gen.next().value);//10
console.log(gen.next().value);//11
console.log(gen.next().value);//12
console.log(gen.next().value);//13
console.log(gen.next().value);//20
console.log(gen.next().value);//undefined
运转结果就是运用一个遍历器,遍历了多个Generator
函数,有递归的结果。