Eugen: Promise.all mit Funktionen!?

Hey Ho,

Habe mich wieder mal in eine Ecke gescriptet. Da man sich in meinen Code wohl SEHR mühsam einlesen müsste (benötigt DRINGENDSTES Refactoring 😀), habe ich die Quintessenz in einem repräsentativen Snippet zusammengefasst.

Kurzum die Frage:

Ist es irgendwie möglich, Promise.all eine Funktion und nicht ein Promise zu überreichen (vielleicht indem ich eben einen Promise, wie im Code gezeigt, zurückgebe?)?

async function erstePromiseFunction() {
	return await new Promise((res, rej) => {
		setTimeout(res, 1 * 1000);
	});
}

async function zweitePromiseFunction() {
	return await new Promise((res, rej) => {
		setTimeout(res, 2 * 1000);
	});
}

async function Abfolge() {
	console.log("VORHER");
	await Promise.all([erstePromiseFunction, zweitePromiseFunction]).then((results) => {
		console.log("ALL PROMISES RESOLVED.");
	});
	console.log("LETZTE MELDUNG");
}
Abfolge();

Oben gezeigtes Snippet zeigt sich unbeeindruckt, ALL PROMISES RESOLVED. und LETZTE MELDUNG werden sofort ausgegeben.

🤔

Danke! Liebe Grüße, Eugen

  1. Hallo Eugen,

    die Wikiseite zu async und await hat Beispiele, die deinem ähnlich sehen, aber nicht identisch sind. Vielleicht hilft dir das weiter.

    Viele Grüße
    Robert

  2. Hallo Eugen,

    async function erstePromiseFunction() {
      return await new Promise((res, rej) => {
    		setTimeout(res, 1 * 1000);
    	});
    }
    

    Zu umständlich. Eine async-Funktion, um etwas zu awaiten und dann gleich zurückzugeben? Gib einfach das Promise zurück und fertig. Es sei denn, im real life™️ passiert da noch viel mehr…

    function erstePromiseFunction() {
      return new Promise((res, rej) => {
    		setTimeout(res, 1 * 1000);
    	});
    }
    

    function Abfolge()

    Was Du da zeigst, ist aber keine Abfolge. Promise.all erwartet einen Schwarm von Promises und wartet auf alle gleichzeitig. Die Aktivitäten, die diese Promises irgendwann erfüllen, müssen vorher allesamt eingeleitet worden sein.

    Wenn Du eine Abfolge willst, dass also die zweite Promise-Funktion anläuft, wenn die erste ihr Promise erfüllt, musst Du sie auch nacheinander aufrufen. Entweder über eine then-Kette, oder über mehrere awaits hintereinander.

    Promise.all([erstePromiseFunction, zweitePromiseFunction])

    übergibt keine Promises an Promise.all, sondern Funktionsobjekte. Diese werden nicht aufgerufen! Aus irgendwelchen mystischen Gründen akzeptiert Promise.all auch Nicht-Promises und kapselt sie der leichteren Handhabbarkeit wegen einfach in ein resolvtes Promise ein.

    Bau mal console.log Aufrufe in erstePromiseFunction und zweitePromiseFunction ein - die wirst Du nicht zu sehen bekommen.

    Du willst statt dessen dies:

    Promise.all([erstePromiseFunction(), zweitePromiseFunction()])

    Das ruft beide Funktionen auf. Sie erzeugen das Promise, starten dem Timer und kehren sofort zurück. Und Promise.all bekommt ein Array mit diesen Promises.

    Zu deiner Frage:

    Ist es irgendwie möglich, Promise.all eine Funktion und nicht ein Promise zu überreichen

    Nein. Es erwartet ein Array aus Promises. Was willst Du mit deiner Funktion erreichen? Welches Problem willst Du eigentlich lösen?

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Danke Rolf und Robert!

      Nein. Es erwartet ein Array aus Promises. Was willst Du mit deiner Funktion erreichen? Welches Problem willst Du eigentlich lösen?

      ...okay, die erwähnten Funktionen beherbergen eine gewisse Anzahl an Parametern, anhand derer sich die Gestaltung der Promises abbildet. Habe das Problem jetzt so gelöst, dass ich ein globales Array zum Einfangen der Promises kreiert habe, in welches ich die entsprechenden Promises pushe - dieses globale Array kann ich dann an Promise.all übergeben.

      Geht anscheinend nicht anders.

      LG, Eugen

      1. Hallo Eugen,

        Geht anscheinend nicht anders.

        Einer aus der Kategorie "Berühmte letzte Worte"…

        Aber ohne Kenntnis deines Gesamtsystems lässt sich schlecht das Gegenteil beweisen.

        Rolf

        --
        sumpsi - posui - obstruxi