如果您有像
这样的生成器function* f () {
// Before stuff.
let a = yield 1;
let b = yield 2;
return [a,b];
}
然后运行
var g = f();
// this question is over this value.
g.next(123); // returns: { value: 1, done: false }
g.next(456); // returns: { value: 2, done: false }
g.next(); // returns: { value: [ 456, undefined ], done: true }
第一次调用.next()
将a
设置为123
,第二次调用将b
设置为456
,但最后一次调用{ {1}}这是回归,
.next()
第一次调用{ value: [ 456, undefined ], done: true }
中的参数是否会丢失?他们会怎么样?使用上面的示例,如何设置g.next
?
答案 0 :(得分:4)
尝试:
var g = f();
// this question is over this value.
g.next(); // returns: { value: 1, done: false }
g.next(123); // returns: { value: 2, done: false }
g.next(456); // returns: { value: [123, 456], done: true }
答案 1 :(得分:2)
传递给第一个' next()'的值呼叫被忽略。查看此ES6 TDD Coding Kata
上的最后一个测试(第34行)对于那些对a
& b
正在设置中,查看" Advanced Generators"可能是个好主意。 Iterators & Generators
答案 2 :(得分:1)
来自MDN Iterators and generators。
传递给next()的值将被视为暂停生成器的最后一个yield表达式的结果。
数目:
第一次调用g.next时的参数是否会丢失?
由于第一次调用时没有last yield expression that paused the generator
,因此基本上忽略了该值。您可以在ECMAScript 2015 Language Specification中阅读更多内容。
他们会怎么样?
在next()
的后续调用中,传递的值将用作the return value of the last yield expression that paused the generator
。
使用上面的例子,我该如何设置?
您可以LJHarb suggested完成。
"use strict";
let f = function*() {
let a = yield 1;
let b = yield 2;
return [a, b];
};
let g = f();
document.querySelector("#log_1").innerHTML = JSON.stringify(g.next());
document.querySelector("#log_2").innerHTML = JSON.stringify(g.next(123));
document.querySelector("#log_3").innerHTML = JSON.stringify(g.next(456));

<div id="log_1"></div>
<div id="log_2"></div>
<div id="log_3"></div>
&#13;