【问题标题】:Generator usage about yield生成器关于产量的使用
【发布时间】:2020-04-29 18:57:07
【问题描述】:

我的代码:

function wrapper(generatorFunction) {
  return function (...args) {
    let generatorObject = generatorFunction(...args);
    generatorObject.next();
    return generatorObject;
  };
}

const wrapped = wrapper(function* () {
  console.log(`First input: ${yield}`);
  return 'DONE';
});

wrapped();

我有一个关于为什么 Web 控制台不打印 First input 的问题。虽然yield 返回未定义。

【问题讨论】:

  • 你想完成什么?这看起来比我能想象的任何目的都复杂得多。

标签: javascript ecmascript-6 generator


【解决方案1】:

第一次执行 next() 时,它会一直执行到第一次 yield。

function wrapper(generatorFunction) {
    return function (...args) {
        let generatorObject = generatorFunction(...args);
        generatorObject.next(); // Will Print till yield keyword => First Yield Call
        console.log('About to pass in a value to First Input');
        let done = generatorObject.next(42); // Will Print and Bring the next yielded value => First Input 22
        console.log(done);
        return generatorObject;
    };
}

wrapped = wrapper(function* () {
    console.log('First Yield Call');
    console.log(`First input: ${yield}`);
    return 'DONE';
});

wrapped();

【讨论】:

  • so,如果yeild没有返回值,则无法打印。
  • 对不起,我没有得到你。在 Generator 函数中使用 return 只会将其视为最后一个 yield,这意味着它将给出 {value: return_value, done: true}
  • 我的意思是当程序第一次调用next方法时,它没有返回任何值。所以浏览器无法打印“first input”。我的问题是为什么不能打印“first input”什么时候第一次打电话?
  • 它很简单,对于第一个 next 调用,它将执行第一个 yield 关键字之前的所有代码,并且您在 yield 右侧的任何内容都将作为结果返回给第一个 next 调用。第二次调用 next 时,你会继续你离开的,你甚至可以将数据传递给下一次调用,你可以将这些数据保存在一个变量中,并在生成器函数体中使用它。
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 2016-07-26
  • 1970-01-01
  • 2015-07-26
  • 2020-01-18
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多