Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以将参数传递给ES6发电机功能吗_Javascript_Generator_Ecmascript 6 - Fatal编程技术网

Javascript 我可以将参数传递给ES6发电机功能吗

Javascript 我可以将参数传递给ES6发电机功能吗,javascript,generator,ecmascript-6,Javascript,Generator,Ecmascript 6,这是一个ES6发电机: function *Gen() { var input1 = yield 'output1' } var gen = Gen() gen.next('input1').value // return 'output1' function myGenerator(startFrom) { return (function *() { var i = startFrom; while (true) yield i++;

这是一个ES6发电机:

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

var gen = Gen()

gen.next('input1').value // return 'output1'
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
第一次调用gen时,返回
output1
,但变量
input1
不等于传入的
'input1'
,输入的值实际上是'input2',第二次
下一次('input2')
调用

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

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

关于generator的一篇很棒的文章回答了我的问题,input1被扔掉了,无法访问它。这很奇怪,但却是真的

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

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

var gen = Gen()

gen.next('input1').value // return 'output1'
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

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

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

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

var gen = Gen()

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

首先,让我们简单介绍一下这个例子:

函数*createGenerator(输入){
产量投入
}
变量生成器=createGenerator('输入')
console.log(
发电机
.next()
价值
)
//输入
因此,您可以在创建时将值传递到生成器中并将其拉出,但如果您已经创建了生成器,则获取值的唯一方法是通过
。next
。但下一步是哪个

函数*createGenerator(){
常量输入=产量
产量投入
}
变量生成器=createGenerator()
console.log(
发电机
.next('input1')
价值
)
//未定义
console.log(
发电机
.next('input2')
价值
)
//输入2
正如您在本例中所看到的,第一个输入无法通过,但第二个输入通过。这是因为您的代码在生成器中执行,直到第一次
yield
,然后停止。因此,您传入的第一个值将丢失,因为没有代码对其求值

让我们看另一个例子:

函数*createGenerator(){
常量输入1=产量
常量输入2=产量输入1
产量投入2
}
变量生成器=createGenerator()
console.log(
发电机
.next('input0')
价值
)
//未定义
console.log(
发电机
.next('input1')
价值
)
//输入1
console.log(
发电机
.next('input2')
价值
)
//输入2
console.log(
发电机
.next('input3')
价值
)
//未定义

当您第二次调用
.next
时,您将计算传入的值,并继续处理代码,直到下一次
产生
。在本例中,您执行
产生输入
,但它的左边没有任何内容,因为从技术上讲,这是JavaScript的AST中执行的“下一行”。

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

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

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

嗯?这不是高阶函数。并且可以被平凡的
函数*myGenerator(i){(true)yield i++;}
@Bergi-you-can:}替换,不知何故我认为您不能。谢谢“高阶”项有什么问题吗?对我来说,两个生成器都不符合不返回函数的定义。。。很可能最初是这样的。我把它投了更高的票——这太棒了,正是我所需要的,谢谢大家,这是一个众所周知的问题。通常的解决方案是生成一个被丢弃的伪初始值,但服务器将“种子”生成器。
当您获得没有收益的生成器时,您可以将值推送到(您位于生成器函数的开头)
+1