07. Generators Composition

Композиция — это естественное встраивание одного генератора в поток другого. При композиции значения из вложенного генератора выдаются «по мере готовности». Поэтому она будет работать даже если поток данных из вложенного генератора оказался бесконечным или ожидает какого-либо условия для завершения.

Для комбинирования используется специальная форма yield*. Она применима только к другому генератору и делегирует ему выполнение. То есть, при yield* интерпретатор переходит внутрь генератора-аргумента выполняет его, и все yield, которые он делает, выходят из внешнего генератора. Получается — как будто мы вставили код внутреннего генератора во внешний напрямую:

function* foo() {
  yield "a";
  yield "b";
}

function* bar() {
  yield "x";
  yield* foo();
  yield "y";
}

const arr = [...bar()];
// ['x', 'a', 'b', 'y']

Внутри себя, yield* работает следующим образом:

function* bar() {
  yield "x";
  for (const value of foo()) {
    yield value;
  }
  yield "y";
}

Значением yield* не обязательно должен быть генератор; это может быть любой итерируемый объект. Одно отличие в yield* от обычного в том, что этот операторы учитывает return-значение.

Last updated

Was this helpful?