在ES6中,第一次调用迭代器的`next`方法时参数会发生什么?

时间:2014-01-21 23:28:40

标签: javascript generator v8 ecmascript-harmony

如果您有像

这样的生成器
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

3 个答案:

答案 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;
&#13;
&#13;