dman
dman

Reputation: 11064

ES6 yield* - only yield one value at a time on referenced generator?

When having a generator reference another generator, is there a way to make it to where the referenced generator g1() will only iterate and yield one value at a time when yield* g1() is invoked? Instead of iterating through all values of g1() when yield* g1().

example from mozilla

For example.... instead of this:

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}

function* g2() {
  yield 1;
  yield* g1();
  yield 5;
}

var iterator = g2();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }

Make it do this:

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}

function* g2() {
  yield 1;
  yield* g1();
  //notice I am calling it a second time for value 3
  yield* g1();
  yield 5;
}

var iterator = g2();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
//notice value 4 is missing
console.log(iterator.next()); // { value: 5, done: false }

Upvotes: 0

Views: 59

Answers (1)

Oriol
Oriol

Reputation: 288130

No. yield* delegates all the values yielded by the other generator.

If you want finer control, you should iterate it manually.

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}
function* g2() {
  yield 1;
  var it = g1();
  yield it.next().value;
  yield it.next().value;
  yield 5;
}

var iterator = g2();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
//notice value 4 is missing
console.log(iterator.next()); // { value: 5, done: false }

Upvotes: 2

Related Questions