Javascript 我可以将参数传递给ES6发电机功能吗
这是一个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++;
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