admin管理员组文章数量:1318156
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
?
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
?
- Duplicate of stackoverflow./questions/20977379/… – Loamhoof Commented Jan 22, 2014 at 10:56
- Possible duplicate of Where argument of first next() call goes? – Bergi Commented Mar 30, 2016 at 17:32
- 1 In simple words ; when we pass argument to next(), it replaces previous yield expression return value with the one we provided.Because it is your first execution of function value 123 is simply discarded. – erhan355 Commented Nov 19, 2019 at 11:30
3 Answers
Reset to default 4Try:
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 }
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
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>
本文标签:
版权声明:本文标题:javascript - In ES6, what happens to the arguments in the first call to an iterator's `next` method? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742041141a2417552.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论