Tach!
Bin in einer Situation, wo ich einige Promises startem will, ohne genau zu wissen, wie viele. Sobald ALLE Promises resolved werden, soll trotzdem
Promise.all
feuern.
Das scheint mir seltsam und nicht zu Ende gedacht zu sein. Was soll passieren, wenn noch gar nicht alle Promises erzeugt sind, aber die bereits erzeugten schon alle erfüllt sind? Was ist dann das Kriterium? "Alle erfüllt" ist ja bereits eingetreten. "Alle erfüllt" kann das Promise.all() feststellen, aber "hab alle bekommen", kann es nicht. Das muss sowieso außerhalb gehandhabt und geprüft werden.
Andererseits laufen Promises auch einfach so vor sich hin, ohne dass sie einem Promise.all() übergeben worden sind. Du kannst die Promises erstmal in einem Array sammeln, und erst wenn du kein neues mehr bekommst, übergibst du das Array dem Promise.all(). Das wartet dann darauf, das die restlichen Promises fertig sind, oder feuert sofort, wenn alle bereits erfüllt sind.
Das
promiseArr
sollte bis zum Schluss eigentlich zu keinem Zeitpunkt leer sein undPromise.all
daher nur einmal ganz zum Schluss resolved werden (Konsole:"All done!"
- siehe angehängtes Code Snippet)
Du füllst das Array schrittweise, und mit jedem Schritt startest du ein neues Promise.all(). Es ist nicht so, dass nur ein Promise.all() läuft und das Array überwacht, und sich jedes Mal neu organisiert, wenn es sich ändert. Du hast am Ende vier Promise.all() laufen, die jeweils einzeln feuern.
Das erste Mal wird
decoratedPromise()
mit einemsetTimeout
von0
sofort aufgerufen und impromiseArr
aufgenommen.
Das eine myPromise wird darin aufgenommen. Das wurde beim Erstellen von decoratedPromise durch das Aufrufen von promiseDecorator() als Parameter übergeben, und dort hängt es quasi erstmal rum. Das Ergebnis des Aufrufs war ja, dass die anonyme Funktion mit dem push() in decoratedPromise landet. Und immer wenn du sie aufrufst, wird das eine Promise, das da immer noch im Funktionsparameter von PromiseDecorator hängt, erneut ins Array geschoben.
Noch BEVOR das erste Promise nach
5
Sekunden resolved wird, befinden sich bereits zwei weitere Promises inpromiseArr
, nämlich die persetTimeout
nach2
und3
Sekunden aufgerufen werden.
Es wird kein neues Promise erzeugt. Am Ende hängen 4 Referenzen auf das eine Promise in dem Array.
Meiner Meinung nach müsste
"All done!"
genau einmal, nämlich nach 11 Sekunden feuern, dann nämlich hat auch das letzte aufgerufene Promise seinen Zyklus (6+5 Sekunden) abgeschlossen.Effektiv feuert es nach fünf Sekunden dreimal und eine Sekunde darauf ein viertes Mal.
Das eine Promise feuert nach 5 Sekunden, und löst die drei laufenden Promise.all() aus. Dann kommt noch das 600er setTimeout, und in seiner Folge wird mit dem Array mit den nun 4 Referenzen auf das eine Promise, das außerdem bereits erfüllt ist, das vierte Promise.all() gestartet, das sofort die Erledigung meldet.
dedlfix.