Das yield Schlüsselwort wird eingesetzt zum Anhalten und Fortsetzen einer Generatorfunktion (function* oder veralteten Generatorfunktion) eingesetzt.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
[rv] = yield [expression];
expression- Definiert den Wert, der von der Generatorfunktion über das Iterator Protokoll zurückgegeben wird. wird dieser weggelassen, wird
undefinedzurü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 vonnext()wird die Ausführung direkt nach demyieldfortgesetzt. throwwird 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
IteratorResultObjekt wird zum Aufrufer zurückgegeben, bei demvalueundefinedist unddonetrueist. - Ein
returnStatement wird erreicht. In diesem Fall endet die Ausführung des Generators und einIteratorResultObjekt wird zum Aufrufer zurückgegeben, welches alsvalueden vomreturnStatement spezifizierten Wert enthält unddonetrueist.
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 Latest Draft (ECMA-262) Die Definition von 'Yield' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yield | Chrome Vollständige Unterstützung 39 | Edge Vollständige Unterstützung 12 | Firefox
Vollständige Unterstützung
26
| IE Keine Unterstützung Nein | Opera Vollständige Unterstützung Ja | Safari Vollständige Unterstützung 10 | WebView Android Vollständige Unterstützung 39 | Chrome Android Vollständige Unterstützung 39 | Firefox Android
Vollständige Unterstützung
26
| Opera Android Vollständige Unterstützung Ja | Safari iOS Vollständige Unterstützung 10 | Samsung Internet Android Vollständige Unterstützung 4.0 | nodejs
Vollständige Unterstützung
4.0.0
|
Legende
- Vollständige Unterstützung
- Vollständige Unterstützung
- Keine Unterstützung
- Keine Unterstützung
- Siehe Implementierungshinweise.
- Siehe Implementierungshinweise.
- Benutzer muss dieses Feature explizit aktivieren.
- Benutzer muss dieses Feature explizit aktivieren.
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 einIteratorResultObjekt 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
yieldAusdrucks aktualisert, um konform mit der ES2015 Spezifikation zu sein (Bug 981599):- Der Ausdruck nach dem
yieldSchlüsselwort ist optional und das Weglassen führt nicht mehr zu einemSyntaxError:function* countAppleSales() { yield; }
- Der Ausdruck nach dem