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