Skip to content

生成器(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
}

基于 MIT 许可发布