Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
yield
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Deryield Operator wird verwendet, um eineGeneratorfunktion zu pausieren und fortzusetzen.
In diesem Artikel
Probieren Sie es aus
function* foo(index) { while (index < 2) { yield index; index++; }}const iterator = foo(0);console.log(iterator.next().value);// Expected output: 0console.log(iterator.next().value);// Expected output: 1Syntax
yieldyield expressionParameter
expressionOptionalDer Wert, der über dasIterator-Protokoll aus der Generatorfunktion ausgegeben wird. Wenn weggelassen, wird
undefinedausgegeben.
Rückgabewert
Gibt den optionalen Wert zurück, der an dienext() Methode des Generators übergeben wurde, um die Ausführung fortzusetzen.
Hinweis:Das bedeutet,next() ist asymmetrisch: es sendet immer einen Wert an das aktuell angehalteneyield, gibt aber den Operanden des nächstenyield zurück. Der übergebene Wert des erstennext() Aufrufs kann nicht abgerufen werden, da kein aktuell angehaltenesyield existiert.
Beschreibung
Das Schlüsselwortyield pausiert die Ausführung einer Generatorfunktion und der Wert des Ausdrucks nach demyield Schlüsselwort wird an den Aufrufer des Generators zurückgegeben. Es kann als generatorbasierte Version desreturn Schlüsselworts betrachtet werden.
yield kann nur direkt innerhalb der Generatorfunktion verwendet werden, die es enthält. Es kann nicht innerhalb verschachtelter Funktionen verwendet werden.
Der Aufruf einer Generatorfunktion erzeugt einGenerator Objekt. Jedes Mal, wenn dienext() Methode des Generators aufgerufen wird, wird die Generatorausführung fortgesetzt und läuft bis zu einem der folgenden Punkte:
- Ein
yieldAusdruck. In diesem Fall pausiert der Generator, und dienext()Methode gibt einIterator-Ergebnis Objekt mit zwei Eigenschaften zurück:valueunddone. Die Eigenschaftvalueist der Wert des Ausdrucks nach demyieldOperator, unddoneistfalse, was darauf hinweist, dass die Generatorfunktion nicht vollständig abgeschlossen ist. - Das Ende der Generatorfunktion. In diesem Fall endet die Ausführung des Generators, und die
next()Methode gibt ein Iterator-Ergebnisobjekt zurück, bei demvalueundefinedist unddonetrue. - Eine
returnAnweisung. In diesem Fall endet die Ausführung des Generators, und dienext()Methode gibt ein Iterator-Ergebnisobjekt zurück, bei demvalueder angegebene Rückgabewert ist unddonetrue. - Eine
throwAnweisung. In diesem Fall wird die Ausführung des Generators vollständig gestoppt, und dienext()Methode löst die angegebene Ausnahme aus.
Einmal auf einemyield Ausdruck pausiert, bleibt die Codeausführung des Generators angehalten, bis dienext() Methode des Generators erneut aufgerufen wird. Wenn ein optionaler Wert an dienext() Methode des Generators übergeben wird, wird dieser Wert als Rückgabewert der aktuellenyield Operation des Generators. Der erstenext() Aufruf hat keine entsprechende angehalteneyield Operation, sodass es keine Möglichkeit gibt, das Argument des erstennext() Aufrufs abzurufen.
Wenn diereturn() oderthrow() Methode des Generators aufgerufen wird, wirkt dies, als ob einereturn oderthrow Anweisung am pausiertenyield Ausdruck ausgeführt wurde. Sie könnentry...catch...finally im Körper der Generatorfunktion verwenden, um diese vorzeitigen Abschlüsse zu behandeln. Wenn diereturn() oderthrow() Methode aufgerufen wird, aber kein angehalteneryield Ausdruck vorhanden ist (weilnext() noch nicht aufgerufen wurde oder weil der Generator bereits abgeschlossen ist), dann können die vorzeitigen Abschlüsse nicht behandelt werden und beenden den Generator immer.
Beispiele
>Verwendung von yield
Der folgende Code ist die Deklaration einer Beispiel-Generatorfunktion.
function* countAppleSales() { const saleList = [3, 7, 5]; for (const sale of saleList) { yield sale; }}Sobald eine Generatorfunktion definiert ist, kann ein Iterator wie folgt erstellt werden.
const 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 }Sie können auch einen Wert mitnext(value) in den Generator senden.step wird als Rückgabewert desyield Ausdrucks ausgewertet — obwohl der an dienext() Methode des Generators übergebene Wert beim ersten Aufruf vonnext() ignoriert wird.
function* counter(value) { while (true) { const step = yield value++; if (step) { value += step; } }}const generatorFunc = counter(0);console.log(generatorFunc.next().value); // 0console.log(generatorFunc.next().value); // 1console.log(generatorFunc.next().value); // 2console.log(generatorFunc.next().value); // 3console.log(generatorFunc.next(10).value); // 14console.log(generatorFunc.next().value); // 15console.log(generatorFunc.next(10).value); // 26Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # prod-YieldExpression> |