我可以将参数传递给 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 的值=].然后您需要另一个 yield
或 return
来向生成器的消费者提供您的自定义值。这是代码:
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
这是一个 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 的值=].然后您需要另一个 yield
或 return
来向生成器的消费者提供您的自定义值。这是代码:
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