简体   繁体   English

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'));

This returns: 返回:

{value: "1", done: false}
result a
subgeneratorVariable undefined
{value: undefined, done: true}

So I don't have access to yield results in the nested generator. 因此,我无法在嵌套生成器中获得yield结果。 However! 然而!

In this case: 在这种情况下:

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'));

The result is: 结果是:

{value: "1", done: false}
subgeneratorVariable a
{value: "2", done: false}
subgeneratorVariable2 b
result undefined
{value: undefined, done: true}

So the situation is reversed. 因此情况就相反了。 Now I have access to yielded value ONLY in nested generator. 现在,我只能在嵌套生成器中访问产生的值。

Is there any way of passing values/results between these two generators? 有什么方法可以在这两个生成器之间传递值/结果吗?

yield is going to return what you are passing to next as a parameter, not the expression at right side; yield将返回作为参数传递给next一个对象的内容,而不是右侧的表达式; for...of internally is calling next without parameters so you are getting undefined . for...of内部在没有参数的情况next调用next ,因此您变得undefined

Maybe this example helps you to understand with a do...while instead of for...of : 也许这个例子可以帮助您通过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;

The result is: 结果是:

value: 1
subgeneratorVariable: 1
value: 2
subgeneratorVariable: 2

As you can see, if you want to keep the values between the generators you must pass the result values to the generators next function. 如您所见,如果要在生成器之间保留值,则必须将结果值传递给生成器的next函数。

After upgrading myself with the new yield in javascript and some efforts reading your examples, I think I figured out what you are trying to do and what you are doing wrong. 在用javascript中的新yield提升自己并通过一些努力来阅读示例之后,我想我知道了您要尝试做的事情和您做错了什么。

Your 1st attempt was correct . 您的第一次尝试是正确的 But you placed your console.log incorrectly which mislead you into thinking it was wrong. 但是您错误地放置了console.log ,这使您误认为这是错误的。

I rewrote it so you get better insight of what happens when yield -ing. 我重写了它,以便您更好地了解yield增长时的情况。

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());

In your second example, you delegate the generation to the subgenerator . 在第二个示例中, 将生成委托给subgenerator Doing so, you cannot get the value in your generator itself. 这样做,您无法在生成器本身中获取值。 Because the value is yield -ed and your generator will resume after the subgenerator is finished generating. 因为该值是yield -ed,并且您的生成器将在子生成器完成生成后恢复。 It explains why, your generator only sees undefined . 它解释了为什么您的生成器只看到undefined

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM