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;
【讨论】:
有人想报告这个错误吗? 归档于regenerator
和Babel
。感谢您跟踪。以上是关于ES6 产量(产量 1)(产量 2)(产量 3)()的主要内容,如果未能解决你的问题,请参考以下文章
最新!2020年1-6月饲料生产大数据:猪料增长禽料下降,超2019低于2018