【问题标题】:Getting the return value from a generator in Node JS从 Node JS 中的生成器获取返回值
【发布时间】:2023-03-10 19:46:01
【问题描述】:

我似乎无法弄清楚如何获得生成器的返回值 - 有人知道我做错了什么吗?

function getGeneratorReturn() {
    var generator = runGenerator();
    var generatorReturn = null;

    var done = false;
    while(!done) {
        var currentNext = generator.next();
        console.log('Current next:', currentNext);
        generatorReturn = currentNext.value;
        done = currentNext.done;
    }

    return generatorReturn;
}

function* runGenerator() {
    var a = yield 1;
    var b = yield 2;
    var c = a + b;

    return c;
}

var generatorReturn = getGeneratorReturn();
console.log(generatorReturn); // Should output 3, is outputting NaN

注意:您需要运行带有 --harmony 选项的节点 0.11.12 才能运行此代码。

【问题讨论】:

    标签: javascript node.js generator yield


    【解决方案1】:

    生成器函数不能return 一个值。 相反,生成器函数自动被返回的迭代器实例包装。

    因为生成器函数总是异步执行(由yield 语句触发,甚至通过使用Iterator.next( value) 手动注入值 - 请参阅this examplereturn 语句只能用于“关闭”返回的@ 987654326@ 在您的生成器函数代码中的某处。

    您只能使用 yield 从生成器函数中“返回”值。

    【讨论】:

    • 这是错误的。尝试一些简单的例子,比如 yield 1; return 2. 通过 next() 可以得到返回值,将 done 设置为 true。
    【解决方案2】:

    当我调用 .next 时,它似乎可以通过将当前值传回生成器来工作:

    function getGeneratorReturn() {
        var generator = runGenerator();
        var generatorReturn = null;
    
        var done = false;
        while(!done) {
            var currentNext = generator.next(generatorReturn);
            console.log('Current next:', currentNext);
            generatorReturn = currentNext.value;
            done = currentNext.done;
        }
    
        return generatorReturn;
    }
    
    function* runGenerator() {
        var a = yield 1;
        var b = yield 2;
        var c = a + b;
    
        return c;
    }
    
    var generatorReturn = getGeneratorReturn();
    console.log(generatorReturn); // Should output 3, is outputting NaN
    

    注意:您需要运行带有 --harmony 选项的节点 0.11.12 才能运行此代码。

    【讨论】:

      【解决方案3】:

      currentNext.donetrue时,curentNext.value有返回值。

      您可以将循环编写为:

      var next;
      while (!(next = generator.next()).done) {
          var yieldedValue = next.value;
      }
      var returnValue = next.value;
      

      【讨论】:

      • 是的,这是因为 yield 表达式会产生你传递给生成器的值,正如你已经注意到的那样。您可以通过使用两个语句来规避这种情况:var a = 1; yield a;
      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 2019-09-02
      • 2017-06-04
      • 2018-09-24
      • 2019-01-31
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多