ES6 yield* - 在引用的生成器上一次只能产生一个值

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

本文关键字:一个 yield 引用 ES6 上一次      更新时间:2023-09-26

当一个生成器引用另一个生成器时,有没有办法让它达到引用的生成器g1()在调用yield* g1()时一次只迭代并产生一个值的位置?而不是在yield* g1()时遍历g1()的所有值。

来自 Mozilla 的示例

例如。。。。取而代之的是:

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 }

让它这样做:

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 }

No. yield*委托另一个生成器生成的所有值。

如果需要更精细的控制,则应手动迭代它。

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 }