ES6 产量(产量 1)(产量 2)(产量 3)()

Posted

技术标签:

【中文标题】ES6 产量(产量 1)(产量 2)(产量 3)()【英文标题】:ES6 yield (yield 1)(yield 2)(yield 3)() 【发布时间】:2016-08-25 18:51:20 【问题描述】:
function* generatorFunction() 
  yield (yield 1)(yield 2)(yield 3)();

var iterator = generatorFunction();

// [1, 2, 3]
var iteratedOver = [iterator.next().value, iterator.next().value, iterator.next().value];

我不确定这是如何工作的。

yield 不返回函数引用,那么像(yield 2) 这样的括号语句是什么——它们是没有主体的胖箭头匿名函数吗?像这样使用部分应用程序如何调用它们?

我在这里遗漏了一些东西,有人可以解释一下吗?


更新:在 Chrome 50.0.2661.86、Safari 9.1 (50.0.2661.86)、Firefox 44.0.2 三种浏览器上试用,均无错误。

ESFiddle 也可以正常执行。

评论者报告 Babel 执行也没有错误。

问题来源来自http://tddbin.com/#?kata=es6/language/generator/send-function,第二个kata。

【问题讨论】:

您的代码示例不适合我。 Uncaught TypeError: (intermediate value) is not a function yield 返回您传递给.next(…) 的任何内容。你很幸运,你只调用了 2 次 .next(),下次它会抛出。 @Ben:是的,但它引出了一个问题......是什么让你相信这个代码首先是有效的?你在什么地方看到过吗? @Ben:该链接在输出中产生错误。不过对 Safari 很感兴趣。 @Bergi 3 个调用,实际上,对应于三个“内部”yields 【参考方案1】:

我不确定这是如何工作的。

嗯,是的,它不应该工作。它只是因为 Babel 中的错误而起作用。

yield 不返回函数引用,那么像(yield 2) 这样的括号语句是什么——它们是没有主体的胖箭头匿名函数吗?像这样使用部分应用程序如何调用它们?

不,它真的只是标准功能应用程序,没有魔法。 yield 可以返回一个函数引用,当它这样做时,这可能会起作用。如果没有,它将在第三次.next() 调用中抛出异常。

作为工作版本的示例:

function* generatorFunction() 
  yield (yield 1)(yield 2)(yield 3)();

var test = (a) => 
  console.log(a);
  return (b) => 
    console.log(b);
    return (c) => 
      console.log(c);
      return 4;
    ;
  ;
;
var iterator = generatorFunction();
iterator.next(); // value: 1, done: false
iterator.next(test); // value: 2, done: false
iterator.next("a"); // "a" value: 3, done: false
iterator.next("b"); // "b" undefined value: 4, done: false
iterator.next("d"); // value: undefined, done: true

那么这是如何工作的呢?那些嵌套/链接的yield 语句最好写成

function* generatorFunction() 
  let fn1 = yield 1;
  let a = yield 2;
  let fn2 = fn1(a);
  let b = yield 3;
  let fn3 = fn2(b);
  let res = fn3();
  let d = yield res;
  return undefined;

评论者报告 Babel 执行也没有错误。

那是因为一个 babel 错误。如果你检查transpiler output,它实际上的行为就像

function* generatorFunction() 
  let fn1 = yield 1;
  let a = yield 2;
  let b = yield 3;
  // these are no more executed with only 3 `next` calls
  let fn2 = fn1(a);
  let fn3 = fn2(b);
  let res = fn3();
  let d = yield res;
  return undefined;

【讨论】:

有人想报告这个错误吗? 归档于regeneratorBabel。感谢您跟踪。

以上是关于ES6 产量(产量 1)(产量 2)(产量 3)()的主要内容,如果未能解决你的问题,请参考以下文章

2018.7.14 上半年课程总结-经济学2

行业资讯ANRPC:2月全球天胶产量料下降12.4%

最新!2020年1-6月饲料生产大数据:猪料增长禽料下降,超2019低于2018

如何实现水稻种植环境的远程监管,提高水稻产量?

产量预测基于matlab BP和GRNN神经网络预测粮食产量含Matlab源码 1247期

Python 3.6 asyncio - 从未检索到任务异常 - 任务的产量不好:200