2017-11-19 4 views
2

Ich habe ein Problem mit dem Verständnis der Semantik von "Return" in einem Generator. Ich habe es als den letzten, also letzten Wert verstanden.Semantik des Rückgabewerts eines Generators

function* gen() { 
    yield "foo"; 
    return "bar"; 
} 

for (const x of gen()) { 
    console.log(x); 
} 

In diesem Beispiel wird nur "foo" und nicht "bar" gedruckt.

EDIT:

Gibt es einen Weg, um den Rückgabewert der „done = true“ Iterator mit der „für“ Syntax zu bekommen, oder ist es immer verloren?

Antwort

1

Nein, Sie können nicht den Rückgabewert von einer for … of Schleife erhalten. Sie könnten jedoch versuchen

function* gen() { 
    yield 1; 
    yield 2; 
    return "done"; 
} 
function* genAndLogResult() { 
    const val = yield* gen(); 
    console.log(val); 
} 

for (const x of genAndLogResult()) { 
    console.log(x + 40); 
} 
+0

Könnte man 'yield Ausbeute * gen()' nicht tun? –

+0

@JonasW. Das könnte man, aber ich würde es nicht empfehlen. Der Rückgabewert ist in der Regel sehr verschieden von den gelieferten, er ist * nicht * Teil der Sammlung. Wenn der Autor von Gen es nicht dort hingelegt hat, hatte er wahrscheinlich einen guten Grund dafür. Ich habe die Antwort mit einem besseren Beispiel aktualisiert. – Bergi

+0

Ich glaube nicht, dass das eine richtige Programmierung ist ... Das ist nur ein Hack. Sie sollten dies in keinem Algorithmus in einer geeigneten Sprache benötigen. – Redu

0

Von: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function%2A

Eine return-Anweisung in einem Generator, wenn sie ausgeführt werden, wird der Generator getan machen. Wenn ein Wert zurückgegeben wird, wird er als Wert zurückgegeben. Ein Generator, der zurückgegeben wurde, liefert keine weiteren Werte mehr.

Es ist sinnvoll, dass die for-Schleife den Schritt "done" überspringt. Zum Beispiel:

function* gen() { yield "foo" } 
const inst = gen() 
inst.next() // { done: false, value: "foo" } 
inst.next() // { done: true, value: undefined } 

function* gen() { yield "foo"; return "bar" } 
const inst = gen() 
inst.next() // { done: false, value: "foo" } 
inst.next() // { done: true, value: "bar" } 

Da Generatoren nicht unbedingt eine return Anweisung haben, würden Sie die letzte Iteration der for-Schleife nicht wollen immer mit dem letzten undefined Wert zu tun haben.

+0

Fair genug! Kannst du die Bearbeitung möglicherweise beantworten? – user3612643

+0

Es war nur eine Änderung der Formatierung – chautelly

0

Das Schlüsselwort yield wird zum Anhalten und Fortsetzen einer Generatorfunktion verwendet.

function* gen() { yield "foo"; yield "bar"; }
for (const x of gen()) { console.log(x); }

Es drucken for und bar Wenn Sie mehr Informationen wünschen über yield klicken here

Verwandte Themen