我可以将参数传递给ES6生成器功能

时间:2015-02-26 05:02:38

标签: javascript generator ecmascript-6

这是ES6生成器:

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

var gen = Gen()

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

gen称为第1次,返回output1但变量input1并不等于传递的'input1'input的值实际上是&# 39; input2',第二次next('input2')调用

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

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

5 个答案:

答案 0 :(得分:18)

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

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

var gen = Gen()

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

答案 1 :(得分:6)

This关于生成器的好文章回答了我的问题,input1被抛弃了,没有办法访问它。这很奇怪但真实

答案 2 :(得分:0)

如果需要参数化生成器函数,可以使用返回生成器的高阶函数:

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

样本很可能无用,但可以使用相同的方法,例如,生成随机数生成器。

答案 3 :(得分:0)

首先,让我们简单地看一下这个示例:

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中执行的“下一行”。

答案 4 :(得分:0)

这对我有用,它通过传递应该返回的最大值来生成一个随机数。

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

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