Generator函数是一个函数的内部状态的遍历器(也就是说,Generator函数是一个状态机)。
形式上,Generator函数是一个普通函数,但是有两个特征。
一是,function命令与函数名之间有一个星号; 二是,函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态。
Generator函数是一个函数的内部状态的遍历器(也就是说,Generator函数是一个状态机)。
形式上,Generator函数是一个普通函数,但是有两个特征。
一是,function命令与函数名之间有一个星号; 二是,函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态。
generator的应用场景举例如下:
1. 延迟执行
generator调用后,其状态是挂起的,通过调用next()来让其继续执行,从而达到延迟执行的效果:
function* fibGen (n) {
var current = 0, next = 1, swap;
for (var i = 0; i < n; i++) {
swap = current, current = next
next = swap + next
yield current
}
}
var fibIter = fibGen(20)
var next = fibIter.next()
console.log(next.value)
setTimeout(function () {
var next = fibIter.next()
console.log(next.value)
},2000)
2. 无限长的序列
由于generator是延迟执行的,因此你可以使用generator创建一个无限长的序列:
function* fibGen () {
var current = 0, next = 1, swap
while (true) {
swap = current, current = next
next = swap + next
yield current
}
}
for (var num of fibGen()) {
if (num < 5000) break
}
console.log(num) // 6765
3.异步流程控制
这个可以参考https://github.com/tj/co 的源代码,一个基于generator进行异步流程控制的js库