主题
生成器(generator)
介绍
常规函数 只会返回一个单一值(或者不返回任何值)。而 generator 可以按需一个接一个地返回(“yield”)多个值。它们可与 iterable 完美配合使用,从而可以轻松地创建数据流。
定义生成器
js
function* generateSequence() {
yield 1
yield 2
return 3
}
let generator = generateSequence()
let one = generator.next()
console.log(one) // {value: 1, done: false}
let two = generator.next()
console.log(two) // {value: 2, done: false}
let three = generator.next()
console.log(three) // {value: 3, done: true}
可以使用 for..of
循环遍历它所有的值:
js
function* generateSequence() {
yield 1
yield 2
return 3
}
let generator = generateSequence()
for (let value of generator) {
console.log(value) // 1, 2
}
请注意:上面这个例子会先显示 1
,然后是 2
,然后就没了。它不会显示 3
!
这是因为当 done: true
时,for...of
循环会忽略最后一个 value
。因此,如果想要通过 for..of
循环显示所有的结果,必须使用 yield
返回它们:
js
function* generateSequence() {
yield 1
yield 2
yield 3
}
let generator = generateSequence()
for (let value of generator) {
console.log(value) // 1, 2, 3
}