In ES6, what happens to the arguments in the first call to an iterator's `next` method?

谁说我不能喝 提交于 2019-11-26 23:30:54

问题


If you have an generator like,

function* f () {
  // Before stuff.
  let a = yield 1;
  let b = yield 2;
  return [a,b];
}

And, then run

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 }

The first call to .next() to set a to 123 and the second call to set b to 456, however at the last call to .next() this is return,

{ value: [ 456, undefined ], done: true }

Does the argument in the first call to g.next get lost? What happens to them? Using the above example, how do I set a?


回答1:


Try:

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 }



回答2:


Values passed into the first 'next()' call are ignored. Look at the last test (line 34) on this ES6 TDD Coding Kata

For those confused on how a & b are getting set, it might be a good idea to look at the "Advanced Generators" section of Iterators & Generators




回答3:


From MDN Iterators and generators.

A value passed to next() will be treated as the result of the last yield expression that paused the generator.

Answers:

Does the argument in the first call to g.next get lost?

Since there is no last yield expression that paused the generator on the first call this value is essentially ignored. You can read more in the ECMAScript 2015 Language Specification.

What happens to them?

On subsequent calls of next() the value passed will be used as the return value of the last yield expression that paused the generator.

Using the above example, how do I set a?

You can do as 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>


来源:https://stackoverflow.com/questions/21271216/in-es6-what-happens-to-the-arguments-in-the-first-call-to-an-iterators-next

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!