yield*

Der yield* Ausdruck wird eingesetzt um an einen anderen Generator oder iterierbares Objekt zu delegieren.

Syntax

 yield* [[expression]];
expression
Der Ausdruck, der ein Iterierbares Objekt zur├╝ckgibt.

Beschreibung

Das yield* Ausdrucksliteral iteriert ├╝ber den Operanden und gibt jeden zur├╝ckgegebenen Wert zur├╝ck.

Der Wert von yield* Ausdr├╝cken selbst ist der Wert der vom Iterator zur├╝ckgegeben wird, wenn der geschlossen wird (z. B., wenn done true ist).

Beispiele

Zu einem anderen Generator delegieren

Im folgenden Code werden Werte von g1() und g2() beim Aufruf von next() zur├╝ckgegeben.

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}
console.log(iterator.next()); // {value: undefined, done: true}

Andere Iterable Objekte

Neben Generatorobjekten kann yield* auch andere Iterable Objekte wie Arrays, Strings oder Arguments-Objekte zur├╝ckgeben.

function* g3() {
  yield* [1, 2];
  yield* '34';
  yield* Array.from(arguments);
}

var iterator = g3(5, 6);

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}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

Der Wert des yield* Ausdrucks selbst

yield* ist ein Ausdruck, kein Statement, weshalb es zu einem Wert ausgewertet wird.

function* g4() {
  yield* [1, 2, 3];
  return 'foo';
}

var result;

function* g5() {
  result = yield* g4();
}

var iterator = g5();

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: undefined, done: true},
                              // g4() returned {value: 'foo', done: true} at this point

console.log(result);          // "foo"

Spezifikationen

Browserkompatibilit├Ąt

BCD tables only load in the browser

Firefox spezifische Hinweise

  • Beginnend mit Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), wurde das Einlesen des yield Ausdrucks aktualisiert, um der ES2015 Spezifikation gerecht zu werden (Bug 981599):
    • Die Zeilenumbruchrestriktion ist jetzt Implementiert. Es ist kein Zeilenumbruch zwischen "yield" and "*" erlaubt. Code wie der folgende erzeugt einen SyntaxError:
      function* foo() {
        yield
        *[];
      }

Siehe auch