我可以将参数传递给 ES6 生成器函数吗

Can I pass a parameter to ES6 generator function

这是一个 ES6 生成器:

function *Gen() {
    var input1 = yield 'output1'
}

var gen = Gen()

gen.next('input1').value // return 'output1'

gen 第一次调用,return output1 但是变量 input1 不等于传入的 'input1',实际上 input 的值是'input2',第2次next('input2')

我的问题是如何访问下一次第一次调用的 input1,例如:

function *Gen() {
    var input 1 = param1
    var input2 = yield 'output1'
}

This 关于生成器的好文章回答了我的问题,input1 已经被扔掉了,没有办法访问它。这很奇怪但却是真的

如果你想要一个参数化的生成器函数,你可以使用 returns 生成器的高阶函数:

function myGenerator(startFrom) {
    return (function *() {
        var i = startFrom;
        while (true) yield i++;
    })();
}

var gen = myGenerator(5);
console.log(gen.next().value) // 5
console.log(gen.next().value) // 6
console.log(gen.next().value) // 7

高阶生成器也可以使用:

function getGenerator(baseStartFrom, expStartFrom) {
    return (function *() {
        var a = baseStartFrom;
        while (true) {
          yield (function *() {
              var i = expStartFrom;
              while (true) yield Math.pow(a, i++);
          })();
          a++;
        }
    })();
}

var gen = getGenerator(2, 3);
var gen2 = gen.next().value; // generator yields powers of 2
  console.log(gen2.next().value); // 8
  console.log(gen2.next().value); // 16
  console.log(gen2.next().value); // 32
var gen3 = gen.next().value; // generator yields powers of 3
  console.log(gen3.next().value); // 27
  console.log(gen3.next().value); // 81
  console.log(gen3.next().value); // 243

示例很可能没有用,但可以使用相同的方法,例如生成随机数生成器。

当您获得生成器时,您没有 yield 可以将值推送到(您处于生成器函数的开头)。您需要通过不带任何参数调用 gen.next() 来触发生成器并到达第一个 yield。此时,您有一个 yield 供您使用,您可以通过 gen.next('input1') 推送您的值,有效地将表达式 yield 'output1' 替换为您传递给 next - [=22 的值=].然后您需要另一个 yieldreturn 来向生成器的消费者提供您的自定义值。这是代码:

function *Gen() {
    var input1 = yield 'output1'
    return input1
}

var gen = Gen()

gen.next();
gen.next('input1').value // return 'input1'

首先简单举个例子:

function *createGenerator(input) {
    yield input
}

var generator = createGenerator('input')

console.log(
    generator
    .next()
    .value
)
// input

因此您可以在创建时将值传递给生成器并将其拉出,但如果您已经创建了生成器,则获取值的唯一方法是通过 .next 传递它。但是 .next?

function *createGenerator() {
    const input = yield
    yield input
}

var generator = createGenerator()

console.log(
    generator
    .next('input1')
    .value
)
// undefined

console.log(
    generator
    .next('input2')
    .value
)
// input2

如您在此示例中所见,第一个输入未通过,但第二个输入通过。那是因为您的代码在生成器中执行到第一个 yield 然后停止。因此,您传入的第一个值将丢失,因为没有代码对其求值。

再看一个例子:

function *createGenerator() {
    const input1 = yield
    const input2 = yield input1
    yield input2
}

var generator = createGenerator()

console.log(
    generator
    .next('input0')
    .value
)
// undefined

console.log(
    generator
    .next('input1')
    .value
)
// input1

console.log(
    generator
    .next('input2')
    .value
)
// input2

console.log(
    generator
    .next('input3')
    .value
)
// undefined

当您第二次调用 .next 时,您计算传入的值,并继续处理代码直到下一个 yield。在这种情况下,您执行 yield input,但在它的左侧什么也没有,因为从技术上讲,这是 JavaScript 的 AST 中执行的 "next line"。

这对我有用,可以通过传递它应该 return 的最大值来生成随机数 return。

function *GenerateRandomNumber(maxNo){
    while(true){
        yield Math.floor(Math.random() * maxNo);
    }
}

let randomGenerator = GenerateRandomNumber(10);
randomGenerator.next().value; // A random Number between 0 - 9