Obwohl der Hauptzweck der Ausbeute Schlüsselwort ist Iteratoren über einige Daten zur Verfügung zu stellen, ist es auch sehr bequem ist, es zu benutzen asynchrone Schleifen zu erstellen:Wie verwendet man die Rendite mit Callback-basierten Loops?
function big_loop_async(delay) {
var iterator = big_loop();
function doNext() {
var next = iterator.next();
var percent_done = next.done?100:next.value;
console.log(percent_done, " % done.");
// start next iteration after delay, allowing other events to be processed
if(!next.done)
setTimeout(doNext, delay);
}
setTimeout(doNext, delay);
}
:
function* bigLoop() {
// Some nested loops
for(...) {
for(...) {
// Yields current progress, eg. when parsing file
// or processing an image
yield percentCompleted;
}
}
}
Dies kann dann asynchron aufgerufen werden
In modernen Javascript sind Callback-basierte Loops jedoch recht populär geworden. Wir haben Array.prototype.forEach
, Array.prototype.find
oder Array.prototype.sort
. Alle diese basieren auf einem Rückruf, der für jede Iteration übergeben wird. Ich habe sogar gehört, dass es empfehlenswert ist, dass wir diese verwenden, wenn wir können, weil sie besser als Standard für Schleifen optimiert werden können.
Ich verwende auch häufig Callback-basierte Loops, um einige komplexe Looping-Muster zu abstrahieren.
Und die Frage ist, ist es möglich, diese in yield
basierte Iteratoren zu verwandeln? Betrachten Sie als einfaches Beispiel, dass Sie ein Array asynchron sortieren möchten.
Würde ein Array asynchron (mit einem Generator und einem einzelnen Thread von js) sortieren, irgendwelche Vorteile haben? –
@DavinTryon Es ist ein * Beispiel *, Beispiele sind nicht entworfen, um praktisch zu sein, aber um einfach zu verstehen. Wie auch immer, ein Array, das lange genug ist, könnte zu lange dauern, um es zu sortieren, und könnte beispielsweise Personen von Ihrem Server trennen oder den Browser des Benutzers verzögern. –
@ TomášZato Dies ist ein [guter Artikel] (http://raganwald.com/2016/05/07/jacascript-generators-for-people-who-dont-give-a-shit-about-getting-stuff-done .html), die Sie vielleicht interessant finden (unglücklicher Titel). Also, kurze Antwort auf Ihre OP, ist ja, es kann getan werden. –