JavaScript: 在嵌套生成器中使用 yield 设置值
JavaScript: Setting value using yield in nested generators
function* test(action) {
const subgenerator = function*() {
const subgeneratorVariable = yield '1';
console.log('subgeneratorVariable', subgeneratorVariable);
};
for (const generatedValue of subgenerator()) {
const result = yield generatedValue;
console.log('result', result);
}
}
const gen = test();
console.log(gen.next());
console.log(gen.next('a'));
这个returns:
{value: "1", done: false}
result a
subgeneratorVariable undefined
{value: undefined, done: true}
所以我无法访问嵌套生成器中的 yield 结果。然而!
在这种情况下:
function* test(action) {
const subgenerator = function*() {
const subgeneratorVariable = yield '1';
console.log('subgeneratorVariable', subgeneratorVariable);
const subgeneratorVariable2 = yield '2';
console.log('subgeneratorVariable2', subgeneratorVariable2);
};
const result = yield* subgenerator();
console.log('result', result);
}
const gen = test();
console.log(gen.next());
console.log(gen.next('1'));
console.log(gen.next('2'));
结果是:
{value: "1", done: false}
subgeneratorVariable a
{value: "2", done: false}
subgeneratorVariable2 b
result undefined
{value: undefined, done: true}
所以情况反过来了。现在我只能在嵌套生成器中访问产生的值。
有什么方法可以在这两个生成器之间传递 values/results 吗?
在使用 javascript 中的新 yield
升级自己并努力阅读您的示例后,我想我弄清楚了您正在尝试做什么以及您做错了什么。
您的第一次尝试是正确的。但是你把 console.log
放错了,误导你认为这是错误的。
我重写了它,以便您更好地了解 yield
-ing 时会发生什么。
function* generator() {
function* subgenerator() {
yield '1';
yield '2';
};
for (let generatedValue of subgenerator()) {
// Use generatedValue here ...
console.log("Inside generator:",generatedValue);
// .. and finally yield it to your main program
yield generatedValue;
}
}
let gen = generator();
console.log("Outside generator:",gen.next());
console.log("Outside generator:",gen.next());
console.log("Outside generator:",gen.next());
在您的第二个示例中,您将发电委托给子发电机。这样做,您无法获得生成器本身的价值。因为该值是 yield
-ed 并且您的生成器将在子生成器完成生成后恢复。它解释了为什么您的生成器只能看到 undefined
.
yield
将 return 作为参数传递给 next
的内容,而不是右侧的表达式; for...of
内部调用不带参数的 next
,因此您得到 undefined
。
也许这个例子可以帮助您理解 do...while
而不是 for...of
:
function* test(action) {
const subgenerator = function*() {
let subgeneratorVariable;
subgeneratorVariable = yield '1';
console.log("subgeneratorVariable: " + subgeneratorVariable);
subgeneratorVariable = yield '2';
console.log("subgeneratorVariable: " + subgeneratorVariable);
};
const sub = subgenerator();
let value;
do {
value = yield sub.next(value).value;
console.log("value: " + value);
} while(value);
}
const gen = test();
let value;
value = gen.next().value;
value = gen.next(value).value;
value = gen.next(value).value;
结果是:
value: 1
subgeneratorVariable: 1
value: 2
subgeneratorVariable: 2
如您所见,如果要保留生成器之间的值,则必须将结果值传递给生成器 next
函数。
function* test(action) {
const subgenerator = function*() {
const subgeneratorVariable = yield '1';
console.log('subgeneratorVariable', subgeneratorVariable);
};
for (const generatedValue of subgenerator()) {
const result = yield generatedValue;
console.log('result', result);
}
}
const gen = test();
console.log(gen.next());
console.log(gen.next('a'));
这个returns:
{value: "1", done: false}
result a
subgeneratorVariable undefined
{value: undefined, done: true}
所以我无法访问嵌套生成器中的 yield 结果。然而!
在这种情况下:
function* test(action) {
const subgenerator = function*() {
const subgeneratorVariable = yield '1';
console.log('subgeneratorVariable', subgeneratorVariable);
const subgeneratorVariable2 = yield '2';
console.log('subgeneratorVariable2', subgeneratorVariable2);
};
const result = yield* subgenerator();
console.log('result', result);
}
const gen = test();
console.log(gen.next());
console.log(gen.next('1'));
console.log(gen.next('2'));
结果是:
{value: "1", done: false}
subgeneratorVariable a
{value: "2", done: false}
subgeneratorVariable2 b
result undefined
{value: undefined, done: true}
所以情况反过来了。现在我只能在嵌套生成器中访问产生的值。
有什么方法可以在这两个生成器之间传递 values/results 吗?
在使用 javascript 中的新 yield
升级自己并努力阅读您的示例后,我想我弄清楚了您正在尝试做什么以及您做错了什么。
您的第一次尝试是正确的。但是你把 console.log
放错了,误导你认为这是错误的。
我重写了它,以便您更好地了解 yield
-ing 时会发生什么。
function* generator() {
function* subgenerator() {
yield '1';
yield '2';
};
for (let generatedValue of subgenerator()) {
// Use generatedValue here ...
console.log("Inside generator:",generatedValue);
// .. and finally yield it to your main program
yield generatedValue;
}
}
let gen = generator();
console.log("Outside generator:",gen.next());
console.log("Outside generator:",gen.next());
console.log("Outside generator:",gen.next());
在您的第二个示例中,您将发电委托给子发电机。这样做,您无法获得生成器本身的价值。因为该值是 yield
-ed 并且您的生成器将在子生成器完成生成后恢复。它解释了为什么您的生成器只能看到 undefined
.
yield
将 return 作为参数传递给 next
的内容,而不是右侧的表达式; for...of
内部调用不带参数的 next
,因此您得到 undefined
。
也许这个例子可以帮助您理解 do...while
而不是 for...of
:
function* test(action) {
const subgenerator = function*() {
let subgeneratorVariable;
subgeneratorVariable = yield '1';
console.log("subgeneratorVariable: " + subgeneratorVariable);
subgeneratorVariable = yield '2';
console.log("subgeneratorVariable: " + subgeneratorVariable);
};
const sub = subgenerator();
let value;
do {
value = yield sub.next(value).value;
console.log("value: " + value);
} while(value);
}
const gen = test();
let value;
value = gen.next().value;
value = gen.next(value).value;
value = gen.next(value).value;
结果是:
value: 1
subgeneratorVariable: 1
value: 2
subgeneratorVariable: 2
如您所见,如果要保留生成器之间的值,则必须将结果值传递给生成器 next
函数。