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 zu pausieren und fortzusetzen.
Probieren Sie es aus
Syntax
yield
yield expression
Parameter
expression
Optional-
Der Wert, der über das Iterator-Protokoll von der Generatorfunktion geliefert werden soll. Wenn weggelassen, wird
undefined
geliefert.
Rückgabewert
Gibt den optionalen Wert zurück, der an die next()
-Methode des Generators übergeben wurde, um seine Ausführung fortzusetzen.
Hinweis: Das bedeutet, next()
ist asymmetrisch: Es sendet immer einen Wert an das aktuell angehaltene yield
, gibt aber den Operand 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 pausiert die Ausführung einer Generatorfunktion und der Wert des Ausdrucks, der dem yield
-Schlüsselwort folgt, wird an den Aufrufer des Generators zurückgegeben. Es kann als eine 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 konstruiert ein Generator
-Objekt. Jedes Mal, wenn die next()
-Methode des Generators aufgerufen wird, wird die Ausführung des Generators fortgesetzt und läuft bis zu einem der folgenden Punkte:
- 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 noch 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 demvalue
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 demvalue
der angegebene Rückgabewert unddone
true
ist. - Eine
throw
-Anweisung. In diesem Fall wird die Ausführung des Generators vollständig abgebrochen und dienext()
-Methode wirft die angegebene Ausnahme.
Sobald auf einem yield
-Ausdruck pausiert wurde, bleibt die Codeausfü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 zum Wert, der von der aktuellen yield
-Operation des Generators zurückgegeben wird. Der erste next()
-Aufruf hat keine entsprechende angehaltene yield
-Operation, sodass es keine Möglichkeit gibt, das Argument abzurufen, das an den ersten next()
-Aufruf übergeben wurde.
Wenn die return()
- oder throw()
-Methode des Generators aufgerufen wird, wirkt dies so, als ob an der pausierten yield
-Ausdruck eine return
- oder throw
-Anweisung ausgeführt wurde. Sie können try...catch...finally
innerhalb des Funktionskörpers des Generators verwenden, um diese vorzeitigen Beendigungen zu behandeln. Wenn die return()
- oder throw()
-Methode aufgerufen wird, aber kein angehaltener yield
-Ausdruck existiert (weil next()
noch nicht aufgerufen wurde oder weil der Generator bereits abgeschlossen ist), können die vorzeitigen Beendigungen 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 (let i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
Sobald eine Generatorfunktion definiert ist, kann sie durch Konstruktion 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 — obwohl der Wert, der beim ersten Aufruf von next()
an die next()
-Methode des Generators übergeben wird, ignoriert wird.
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 Language Specification # prod-YieldExpression |
Browser-Kompatibilität
BCD tables only load in the browser