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.
Der yield
Operator wird verwendet, um eine Generatorfunktion anzuhalten und fortzusetzen.
Probieren Sie es aus
function* foo(index) {
while (index < 2) {
yield index;
index++;
}
}
const iterator = foo(0);
console.log(iterator.next().value);
// Expected output: 0
console.log(iterator.next().value);
// Expected output: 1
Syntax
yield
yield expression
Parameter
expression
Optional-
Der Wert, der von der Generatorfunktion über das Iterator-Protokoll geliefert wird. Falls weggelassen, wird
undefined
geliefert.
Rückgabewert
Gibt den optionalen Wert zurück, der an die next()
Methode des Generators übergeben wird, um seine Ausführung fortzusetzen.
Hinweis:
Das bedeutet, next()
ist asymmetrisch: Es sendet immer einen Wert an das aktuell angehaltene yield
, gibt jedoch den Operanden des nächsten yield
zurück. Das Argument, das an den ersten next()
Aufruf übergeben wird, kann nicht abgerufen werden, da es kein derzeit angehaltenes yield
gibt.
Beschreibung
Das yield
Schlüsselwort hält die Ausführung der Generatorfunktion an und der Wert des Ausdrucks nach dem yield
Schlüsselwort wird an den Aufrufer des Generators zurückgegeben. Es kann als generatorbasierte Version des return
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 erstellt ein Generator
Objekt. Jedes Mal, wenn die next()
Methode des Generators aufgerufen wird, wird die Ausführung des Generators fortgesetzt und läuft, bis eine der folgenden Bedingungen eintritt:
- Ein
yield
Ausdruck. In diesem Fall pausiert der Generator, und dienext()
-Methode gibt ein Iterator-Ergebnis Objekt mit zwei Eigenschaften zurück:value
unddone
. Dievalue
Eigenschaft ist der Wert des Ausdrucks nach demyield
Operator, unddone
istfalse
, 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 dem dervalue
undefined
ist unddone
true
ist. - Eine
return
Anweisung. In diesem Fall endet die Ausführung des Generators, und dienext()
Methode gibt ein Iterator-Ergebnisobjekt zurück, bei dem dervalue
der angegebene Rückgabewert ist unddone
true
ist. - Eine
throw
Anweisung. In diesem Fall wird die Ausführung des Generators vollständig angehalten, und dienext()
Methode wirft die angegebene Ausnahme.
Sobald eine yield
Expression pausiert wird, bleibt die Code-Ausführung des Generators angehalten, bis die next()
-Methode des Generators erneut aufgerufen wird. Wenn ein optionaler Wert an die next()
Methode des Generators übergeben wird, wird dieser Wert der Wert, der von der aktuellen yield
Operation des Generators zurückgegeben wird. Der erste next()
Aufruf hat keine entsprechende angehaltene yield
Operation, daher gibt es keine Möglichkeit, das an den ersten next()
Aufruf übergebene Argument zu erhalten.
Wenn die return()
oder throw()
Methode des Generators aufgerufen wird, verhält es sich, als ob eine return
oder throw
Anweisung an der angehaltenen yield
Expression ausgeführt wurde. Sie können im Funktionskörper des Generators try...catch...finally
verwenden, um mit diesen frühen Abschlüssen umzugehen. Wenn die return()
oder throw()
Methode aufgerufen wird, aber keine angehaltene yield
Expression vorhanden ist (weil next()
noch nicht aufgerufen wurde oder weil der Generator bereits abgeschlossen ist), können die frühen Abschlüsse nicht behandelt werden und beenden immer den Generator.
Beispiele
Verwendung von yield
Der folgende Code ist die Deklaration einer Beispiel-Generatorfunktion.
function* countAppleSales() {
const saleList = [3, 7, 5];
for (let i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
Sobald eine Generatorfunktion definiert ist, kann sie durch Erstellen eines Iterators verwendet werden, wie gezeigt.
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 mit next(value)
in den Generator senden. step
wird als Rückgabewert des yield
Ausdrucks ausgewertet — der an die next()
Methode des Generators übergebene Wert beim ersten Aufruf von next()
wird jedoch ignoriert.
function* counter(value) {
while (true) {
const step = yield value++;
if (step) {
value += step;
}
}
}
const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # prod-YieldExpression |
Browser-Kompatibilität
BCD tables only load in the browser