Carmen: ADVANCED - promise.all in Verbindung mit decorator functions

Beitrag lesen

Hallo,

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.

Wollte das ohne Einsatz globaler Variablen lösen, und habe mich daher mit decorator functions beschäftigt.

Das promiseArr sollte bis zum Schluss eigentlich zu keinem Zeitpunkt leer sein und Promise.all daher nur einmal ganz zum Schluss resolved werden (Konsole: "All done!" - siehe angehängtes Code Snippet)

Hier, das Szenario, von dem ich denke, dass es eigentlich ablaufen sollte:

Das erste Mal wird decoratedPromise() mit einem setTimeout von 0 sofort aufgerufen und im promiseArr aufgenommen. Noch BEVOR das erste Promise nach 5 Sekunden resolved wird, befinden sich bereits zwei weitere Promises in promiseArr, nämlich die per setTimeout nach 2 und 3 Sekunden aufgerufen werden. Diese beiden Promises werden wieder jeweils nach 5 Sekunden resolved, daher nach 7 Sekunden (2+5 Sekunden) respektive nach 8 Sekunden (3+5 Sekunden).

==> Nach resolve des dritten Promise befindet sich bereits ein weiteres Promise im promiseArr, nämlich das nach 6 Sekunden aufgerufene!

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.

Bin ratlos, bitte um Hilfestellung! Lösungsansätzen bin ich auch nicht allzu sehr abgeneigt.

Danke

	const myPromise = new Promise((resolve, reject) => {
	  setTimeout(() => {resolve()}, 5000);
	});
	
	const promiseDecorator = (promise) => {
	
		let promiseArr = [];
		
		const promiseResolver = () => {
			Promise.all(promiseArr).then(() => {
				console.log("All done!");
			});
		};
		
		return () => {
			promiseArr.push(promise);
			promise;
			promiseResolver();
		}
	}
	
	const decoratedPromise = promiseDecorator(myPromise);

	setTimeout(() => {decoratedPromise()}, 0);
	setTimeout(() => {decoratedPromise()}, 2000);
	setTimeout(() => {decoratedPromise()}, 3000);
	setTimeout(() => {decoratedPromise()}, 6000);