yield

Das yield Schl├╝sselwort wird eingesetzt zum Anhalten und Fortsetzen einer Generatorfunktion (function* oder veralteten Generatorfunktion) eingesetzt.

Syntax

[rv] = yield [expression];
expression
Definiert den Wert, der von der Generatorfunktion ├╝ber das Iterator Protokoll zur├╝ckgegeben wird. wird dieser weggelassen, wird undefined zur├╝ckgegeben.
rv

Gibt den optionalen Wert zur├╝ck, der der next() Methode des Generators ├╝bergeben wird, damit dieser weiter verarbeitet werden kann.

Beschreibung

Das yield Schl├╝sselwort h├Ąlt die Ausf├╝hrung der Generatorfunktion an und gibt den Wert des Ausdrucks nach dem yield Schl├╝sselwort an den Aufrufer des Generators zur├╝ck. Es kann als die generatorbasierte Version des return Schl├╝sselwortes gesehen werden.

Das yield Schl├╝sselwort gibt ein IteratorResult Objekt mit zwei Eigenschaften, value und done, zur├╝ck. Die value Eigenschaft ist das Ergebnis des ausgewerteten yield Ausdrucks und done ist false, was gedeutet, dass der Generator noch nicht fertig ist.

Solange ein yield Ausdruck pausiert, wird die Codeausf├╝hrung des Generators pausiert, bis die next() Methode des Generators aufgerufen wird. Mit jedem Aufruf der Generator next() Methode l├Ąuft der Generator weiter, bis einer der folgenden Punkte eintritt:

  •  Ein yield, welches dazu f├╝hrt, dass der Generator wieder Pausiert und einen neuen Generatorwert zur├╝ckgibt. Beim n├Ąchsten Aufruf von next() wird die Ausf├╝hrung direkt nach dem yield fortgesetzt.
  • throw wird eingesetzt um einen Fehler im Generator zu erzeugen. Dieses stoppt den Generator vollst├Ąndig und f├╝hrt dazu, dass die Ausf├╝hrung beim Aufrufer fortgesetzt wird, wie es bei ├╝blicherweise bei Fehlern der Fall ist.
  • Das Ende einer Generatorfunktion wird erreicht; In diesem Fall endet die Ausf├╝hrung des Generator und ein IteratorResult Objekt wird zum Aufrufer zur├╝ckgegeben, bei dem value undefined ist und done true ist.
  • Ein return Statement wird erreicht. In diesem Fall endet die Ausf├╝hrung des Generators und ein IteratorResult Objekt wird zum Aufrufer zur├╝ckgegeben, welches als value den vom return Statement spezifizierten Wert enth├Ąlt und done true ist.

Wenn ein optionaler Wert der next() Methode des Generators ├╝bergeben wird, wird der Wert es der aktuelle R├╝ckgabewert der yield Operation sein.

Durch den Generatorcodepfad, seinem yield Operator und der M├Âglichkeit einen neuen Startwert zu spezifizierten, indem dieser an Generator.prototype.next() ├╝bergeben wird, sind Generatoren sehr leistungsstark und kontrollierbar.

Beispiele

Der folgende Code ist die Deklaration einer Beispielgeneratorfunktion.

function* countAppleSales () {
  var saleList = [3, 7, 5];
  for (var i = 0; i < saleList.length; i++) {
    yield saleList[i];
  }
}

Wenn eine Generatorfunktion definiert ist, kann dieser benutzt werden, um einen Iterator, wie gezeigt, zu erstellen.

var appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }

Spezifikationen

Spezifikation Status Kommentar
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'Yield' in dieser Spezifikation.
Standard Initiale Definition.
ECMAScript (ECMA-262)
Die Definition von 'Yield' in dieser Spezifikation.
Lebender Standard  

Browserkompatibilit├Ąt

BCD tables only load in the browser

Firefox spezifische Hinweise

  • Angefangen mit Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), erzeugt eine fertige Generatorfunktion keinen TypeError "generator has already finished" mehr. Stattdessen wird ein IteratorResult Objekt wie folgendes zur├╝ckgegeben: { value: undefined, done: true } (Bug 958951).
  • Angefangen mit Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), wurde das einlesen des yield Ausdrucks aktualisert, um konform mit der ES2015 Spezifikation zu sein (Bug 981599):
    • Der Ausdruck nach dem yield Schl├╝sselwort ist optional und das Weglassen f├╝hrt nicht mehr zu einem SyntaxError: function* countAppleSales() { yield; }

Siehe auch