ES6产量* - 仅在参考发电机上一次产生一个值?

时间:2016-08-06 02:44:09

标签: javascript ecmascript-6

当生成器引用另一个生成器时,是否有一种方法可以使引用的生成器g1()只迭代并在调用yield* g1()时生成一个值?而不是在g1()时迭代yield* g1()的所有值。

example from 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 }

1 个答案:

答案 0 :(得分:2)

没有。 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 }