Ferdinand: Promises: .then() reagiert anders als async await! :O

Bin bei Promises gerade über eine interessante Eigenheit gestoßen...

Hab mir Gedanken gemacht, was passiert, wenn bei einem fetch Call z.b. ein Netzwerkfehler oder ein Syntax Error (oder was auch immer) nicht zu einem "regulären" REJECT führt. Im Sinne von

const einPromise = () => {
	return new Promise((res, rej) => {
		throw new Error("OHMAGEE, an error occurred!");
	});
};

In einem try catch Block muss ich diesen Fall extra auffangen, da ich sonst einen uncaught Error produziere:


try {
	einPromise().then(res => console.log(res)).catch(err => console.log("AAAND THE ERROR IS: ", err)); // catch for thrown error
} catch(err) { // catch for regular reject (rej)
	console.log("AAAND THE REJECT CATCH IS: ", err);
}

Dies ist aber nicht der Fall, wenn ich mit async await arbeite:

async function asyncAwaitApproach() {
	try { // hier wird der Error an den catch Block weitergeleitet, ich produziere KEINEN uncaught error!
		const res = await einPromise();
		console.log(res);
	} catch(err) {
		console.log("AAAND THE REJECT CATCH IS: ", err);
	}
}
asyncAwaitApproach();

Gibt's dazu irgendwelche Theorien?

Wer sich nun denkt "Na und, was soll das?" --- sorry, finde das eben interessant 😉

AUSSERDEM... vielleicht ist das dem/r ein oder anderen auch noch nie aufgefallen 😝

Schönen Abend,

Ferdinand.

  1. Hallo Ferdinand,

    meine Theorie ist: Du hast das alte Promise-Konzept, das vor der Einführung des async/await Zuckergusses bestand, nicht richtig verstanden.

    Bei "klassischen" Promises verwendest Du kein try/catch, oder höchstens deshalb, um Fehler beim Konstruieren des Promise-Netzes abzufangen. Die eigentliche Verarbeitung findet in den then- und catch-Callbacks der Promises statt, und denen entkommt keine Exception.

    Eine Exception in den Callbacks des Promise-Systems (Exekutoren, then- und catch-Callbacks) führen zu einem rejected Promise, und ein rejected Promise fängt man mit .catch() oder mit dem zweiten Parameter von .then ab. Eine JavaScript-Exception fliegt nie.

    Der async/await Syntaxzucker sieht zur Behandlung von rejected Promises keine eigene Syntax vor. Deswegen musst Du bei await ein try/catch Konstrukt nutzen, um einen reject zu behandeln.

    Also entweder so:

    promiseSomething() 
    .then(result => /* use result */)
    .catch(err => (handle error */)
    

    oder so

    promiseSomething() 
    .then(result => /* use result */, err => /* handle error */)
    

    oder so

    try {
       let result = await promiseSomething() 
       /* use result */
    }
    catch (err) {
       /* handle error */
    }
    

    Wobei diese drei Konstrukte nicht 100% gleichwertig sind. Nr. 1 und Nr. 3 laufen bei einer Exception im Promise-Generator UND bei einer Exception in der result-Verarbeitung in den catch. Die Nr. 2 behandelt nur einen Reject bzw. Error aus dem Executor.

    Eine Exception im catch würden alle 3 als uncaught error liefern.

    Ich bin längst nicht fertig mit dem Artikel, aber hier steht schon einiges darüber.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. @@Rolf B

      Also entweder so … oder so … oder so

      Weder so noch so noch so. Nicht err, sondern error.

      🖖 Живіть довго і процвітайте

      --
      „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
      — @Grantscheam auf Twitter
      1. Hallo Gunnar,

        mein Minus. Für die Form der Mitteilung.

        Ja, die Variable kann man lesbarer benennen.
        Macht das meine Codebeispiel falsch? Nein.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. @@Rolf B

          mein Minus. Für die Form der Mitteilung.

          Das war klar, dass ein Hinweis auf leserlichen Code hier nicht so gut ankommt.

          Ja, die Variable kann man lesbarer benennen.
          Macht das meine Codebeispiel falsch? Nein.

          Ich würde nicht-sprechende Variablen in jedem Code-Review ankreiden – ja, als falsch. Code wird nicht nur für Maschinen geschrieben.

          🖖 Живіть довго і процвітайте

          --
          „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
          — @Grantscheam auf Twitter
          1. mein Minus. Für die Form der Mitteilung.

            Das war klar, dass ein Hinweis auf leserlichen Code hier nicht so gut ankommt.

            Nochmals Zitat, auch wenn schon zitiert: „Für die Form der Mitteilung“. Einself!11 und so.

          2. Ich würde nicht-sprechende Variablen in jedem Code-Review ankreiden – ja, als falsch. Code wird nicht nur für Maschinen geschrieben.

            Ich finde err sehr sprechend. Welche Nicht-Maschine würde das nicht als error verstehen?

            1. Ich würde nicht-sprechende Variablen in jedem Code-Review ankreiden – ja, als falsch. Code wird nicht nur für Maschinen geschrieben.

              Ich finde err sehr sprechend. Welche Nicht-Maschine würde das nicht als error verstehen?

              Vielleicht wäre Ernie ja irritiert.

            2. @@ottogal

              Ich finde err sehr sprechend. Welche Nicht-Maschine würde das nicht als error verstehen?

              Ich – jedenfalls nicht ohne kognitiven Aufwand. Warum sollte ich den leisten müssen?

              Welche Gründe sprächen denn dafür, error zu err zu verstümmeln?

              Speicherplatz sparen. Die 1980er haben angerufen. Sie hätten dieses Argument gern zurück.

              Ansonsten fiele mir nur noch Faulheit ein. Aber kein Codeschreiberling sollte aus reiner Faulheit anderen Codelesern kognitiven Aufwand aufbürden.

              🖖 Живіть довго і процвітайте

              --
              „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
              — @Grantscheam auf Twitter
              1. Ich finde err sehr sprechend. Welche Nicht-Maschine würde das nicht als error verstehen?

                Ich – jedenfalls nicht ohne kognitiven Aufwand. Warum sollte ich den leisten müssen?

                „to err“ ist ein gängiges Pattern für einen Fehler. Wenn Du also richtig, richtig machen möchtest, dann zieh den Faden doch noch weiter und bitte um eine Variable Namens „errorVariableFromCustomEventHandlerIforgotWhyIneedIt“ oder so.

                Welche Gründe sprächen denn dafür, error zu err zu verstümmeln?

                Du hast unnötig die Diskussion vom Zaun gebrochen. Wenn Du „error“ lieber magst, dann nimm das doch. Ober wegen mir auch, weil euer Style-Guide das vorschreibt. Alles schön. Hier im konkreten Fall hingegen... Ach lassen wir das...

                Speicherplatz sparen. Die 1980er haben angerufen. Sie hätten dieses Argument gern zurück.

                Gähn.

                Ansonsten fiele mir nur noch Faulheit ein. Aber kein Codeschreiberling sollte aus reiner Faulheit anderen Codelesern kognitiven Aufwand aufbürden.

                Style-Guide? Ach, lassen wir das...

                1. @@Mitleser 2.0

                  „to err“ ist ein gängiges Pattern für einen Fehler.

                  Du gehst davon aus, dass jeder Nicht-Englisch-Muttersprachler auch das Verb zu dem gängigen Substantiv error kennt. Gewagt.

                  Ach, lassen wir das...

                  Wenigstens darin sind wir uns am Ende einig.

                  🖖 Живіть довго і процвітайте

                  --
                  „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                  — @Grantscheam auf Twitter
                  1. Du gehst davon aus, dass jeder Nicht-Englisch-Muttersprachler auch das Verb zu dem gängigen Substantiv error kennt. Gewagt.

                    Du gehst davon aus, dass es einem Entwickler kognitiven Aufwand kostet, um aus Rolfs "err" Dein "error" abzuleiten. Gewagt.

                    1. @@Mitleser 2.0

                      Du gehst davon aus, dass es einem Entwickler kognitiven Aufwand kostet, um aus Rolfs "err" Dein "error" abzuleiten. Gewagt.

                      Nach ein paar Semestern Psychologie gehe ich dieses Wagnis ein, ja.

                      Übrigens war es schon Ferndinands err.

                      Ferndinands res hatte @Rolf B schon zu result verbessert. Er war nur nicht konsequent.

                      🖖 Живіть довго і процвітайте

                      --
                      „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                      — @Grantscheam auf Twitter
                      1. Du gehst davon aus, dass es einem Entwickler kognitiven Aufwand kostet, um aus Rolfs "err" Dein "error" abzuleiten. Gewagt.

                        Nach ein paar Semestern Psychologie gehe ich dieses Wagnis ein, ja.

                        Übrigens war es schon Ferndinands err.

                        Wunderbar, Herr Beinahe-Psychologe. Wäre es dann womöglich sinnvoll gewesen, dem OP Ferdinand das Feedback „Gucke mal, der Rolf hat Recht, ich möchte nur anmerken, DASS...“ zu geben?

                        Sonst hätte ein Außenstehender ja denken können, dass Deine, ähem "Korrektur" womöglich Rolfs inhaltlich astreine Ausführung in Misskredit stellt.

                        Ich frage für einen Psychologen.

                        Ferndinands res hatte @Rolf B schon zu result verbessert. Er war nur nicht konsequent.

                        Könnte es... womöglich... vielleicht... kognitiv anstrengender sein, aus "res" (resolution, restful api response, resurrection, result) etwas abzuleiten, als aus "err" (ernie und bert, erratisch)? Ich frage für einen Psychologen.

                        1. @@Mitleser 2.0

                          Wäre es dann womöglich sinnvoll gewesen, dem OP Ferdinand das Feedback „Gucke mal, der Rolf hat Recht, ich möchte nur anmerken, DASS...“ zu geben?

                          Das ist der erste sinnvolle Gedanke, den ich von dir in diesem Thread entnehme. So wollte ich mein Posting verstanden wissen.

                          🖖 Живіть довго і процвітайте

                          --
                          „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                          — @Grantscheam auf Twitter
                          1. Wäre es dann womöglich sinnvoll gewesen, dem OP Ferdinand das Feedback „Gucke mal, der Rolf hat Recht, ich möchte nur anmerken, DASS...“ zu geben?

                            Das ist der erste sinnvolle Gedanke, den ich von dir in diesem Thread entnehme. So wollte ich mein Posting verstanden wissen.

                            Dann kram doch mal Deine paar Semester Psychologie hervor und lies den Thread noch einmal von vorne.

                            1. @@Mitleser 2.0

                              Wäre es dann womöglich sinnvoll gewesen, dem OP Ferdinand das Feedback „Gucke mal, der Rolf hat Recht, ich möchte nur anmerken, DASS...“ zu geben?

                              Das ist der erste sinnvolle Gedanke, den ich von dir in diesem Thread entnehme. So wollte ich mein Posting verstanden wissen.

                              Dann kram doch mal Deine paar Semester Psychologie hervor und "les den Thread noch einmal von vorne".

                              Ich folge mal deinem Rat und lande bei meinem Posting, welches sich einzig auf err bezog und damit „ich möchte nur anmerken, DASS...“ erfüllt.

                              „Gucke mal, der Rolf hat Recht“ hab ich nicht gesondert erwähnt, d.h. auch keineswegs in Abrede gestellt.

                              🖖 Живіть довго і процвітайте

                              --
                              „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                              — @Grantscheam auf Twitter
                              1. Dann kram doch mal Deine paar Semester Psychologie hervor und "les den Thread noch einmal von vorne".

                                Ich folge mal deinem Rat und lande bei meinem Posting, welches sich einzig auf err bezog und damit „ich möchte nur anmerken, DASS...“ erfüllt.

                                „Gucke mal, der Rolf hat Recht“ hab ich nicht gesondert erwähnt, d.h. auch keineswegs in Abrede gestellt.

                                You didn't get the point. Vielleicht gut, dass Du das mit der Psychologie dann gelassen hast.

                                1. @@Mitleser 2.0

                                  You didn't get the point. Vielleicht gut, dass Du das mit der Psychologie dann gelassen hast.

                                  Für dich „unfassbar“, wie ich auf Rolfs Posting geantwortet hatte. Aber selbst persönlich werden‽ An dir ist auch nicht gerade ein Psychotherapeut verlorengegangen.

                                  🖖 Живіть довго і процвітайте

                                  --
                                  „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                                  — @Grantscheam auf Twitter
                                  1. You didn't get the point. Vielleicht gut, dass Du das mit der Psychologie dann gelassen hast.

                                    Für dich „unfassbar“, wie ich auf Rolfs Posting geantwortet hatte. Aber selbst persönlich werden‽ An dir ist auch nicht gerade ein Psychotherapeut verlorengegangen.

                                    Das mag sein. Ich bin allerdings auch nicht mit diesem "potentiellem Know-How" hausieren gegangen, gelle? :-)

                              2. Hallo Gunnar,

                                meine Güte, da geht man mal ein paar Stündchen im Sonnenschein spazieren und das Forum explodiert…

                                „Gucke mal, der Rolf hat Recht“ hab ich (...) keineswegs in Abrede gestellt

                                Äh, ich habe allerdings

                                Weder so noch so noch so.

                                exakt so aufgefasst und bin deshalb vom + auf das - abgerutscht. Mit dem Hinweis auf den Ton, denn wenn Du es wagst, zu behaupten, dass error ein besserer Variablenname sei als das kleine und feine err, dann...

                                dann...

                                dann...

                                gebe ich Dir augenblicklich recht!!!

                                Könnten wir damit diesen Seitenthread bitte ruhen lassen und bei Promises bleiben?

                                Rolf

                                PS: Ich ˋhasseˋ diese Tastatur…

                                --
                                sumpsi - posui - obstruxi
                                1. @@Rolf B

                                  PS: Ich ˋhasseˋ diese Tastatur…

                                  Dagegen gibt’s was von Ratio Apple. 😆

                                  🖖 Живіть довго і процвітайте

                                  --
                                  „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                                  — @Grantscheam auf Twitter
              2. Der kognitive Aufwand scheint mir im Beispielsfall jedenfalls gegen null zu gehen.

                Beim von dir gern geführtem CSSBattle ist schon mehr kognitiver Aufwand gefordert - da liegt es bestimmt nicht an Faulheit, wenn es zu Verstümmelungen kommt...

                1. @@ottogal

                  Der kognitive Aufwand scheint mir im Beispielsfall jedenfalls gegen null zu gehen.

                  Mit „scheint mir“ meinst du „scheint bei mir“?

                  Das ist der Punkt: Man sollte an der Stelle nicht von sich auf andere schließen.

                  Beim von dir gern geführtem CSSBattle ist schon mehr kognitiver Aufwand gefordert - da liegt es bestimmt nicht an Faulheit, wenn es zu Verstümmelungen kommt...

                  Oh ja, ganz andere Hausnummer. Und ein Musterbeispiel von schlecht lesbarem Code. Ich verstehe meinen eigenen einen Tag alten Code manchmal kaum noch.

                  🖖 Живіть довго і процвітайте

                  --
                  „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                  — @Grantscheam auf Twitter
                  1. Beim von dir gern geführtem CSSBattle ist schon mehr kognitiver Aufwand gefordert - da liegt es bestimmt nicht an Faulheit, wenn es zu Verstümmelungen kommt...

                    Oh ja, ganz andere Hausnummer. Und ein Musterbeispiel von schlecht lesbarem Code. Ich verstehe meinen eigenen einen Tag alten Code manchmal kaum noch.

                    Aha. Die Psychologie folgert:
                    Daher rührt dein großes Bedürfnis nach Lesbarkeit bei fremdem Code... !

                    1. Hallo,

                      Aha. Die Psychologie folgert:
                      Daher rührt dein großes Bedürfnis nach Lesbarkeit bei fremdem Code... !

                      Endlich mal eine Folgerung der Psychologie, die mir plausibel erscheint.

                      Können wir bitte als Ergebnis dieses Threads festhalten, zukünftig bei Codebeispielen sämtliche Eventualitäten, Styleguides, Tippfeher und Sicherheitslücken zuberücksichtigen?

                      Gruß
                      Kalk

        2. @@Rolf B

          mein Minus. Für die Form der Mitteilung.

          Und welche Wirkung hat das nun auf Außenstehende? Es erweckt den Eindruck, als sei mein Hinweis, sprechende Variablennamen zu verwenden, falsch gewesen.

          IMHO sollte die Bewertungsfunktion mit Bedacht eingesetzt werden; nicht, um persönliche Befindlichkeiten auszutauschen.

          🖖 Живіть довго і процвітайте

          --
          „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
          — @Grantscheam auf Twitter
          1. Und welche Wirkung hat das nun auf Außenstehende? Es erweckt den Eindruck, als sei mein Hinweis, sprechende Variablennamen zu verwenden, falsch gewesen.

            Ich kann dazu nur beitragen, welchen Eindruck es für mich Außenstehenden hatte: völlig berechtigte Kritik an einem Post, der aus nichts weiter bestand, als aus weit hergerholtem, nerdigem Rumgenöle.

            1. @@Mitleser 2.0

              Ich kann dazu nur beitragen, welchen Eindruck es für mich Außenstehenden hatte: völlig berechtigte Kritik an einem Post, der aus nichts weiter bestand, als aus weit hergerholtem, nerdigem Rumgenöle.

              Das Gegenteil ist der Fall: e und err ist nerdig.

              Aber dein persönlicher Eindruck sei dir unbenommen.

              🖖 Живіть довго і процвітайте

              --
              „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
              — @Grantscheam auf Twitter
              1. Das Gegenteil ist der Fall: e und err ist nerdig.

                Dein persönlicher Eindruck sei dir unbenommen.

                Aber dein persönlicher Eindruck sei dir unbenommen.

                Genau.

          2. Hallo Gunnar,

            ich bin ganz froh, dass andere meine Verteidigung übernommen haben.

            Was zu sagen ist, ist eigentlich gesagt worden, ich könnte es nur nochmal nachkauen.

            Dem "nerdigen Genöle" widerspreche ich aber durchaus, der Hinweis auf error statt err war fachlich korrekt. Um das nochmal zu klarzustellen: das Minus gab es von mir, weil dein Weder-noch-noch davor den Eindruck erweckte, alle drei Varianten seien als solches unbrauchbar, und genau deswegen empfand ich das Posting als fachlich nicht hilfreich. Um die Deutungsambivalenz für das Minus zu beseitigen, habe ich ein Posting hinterhergeschickt.

            Auch hier nochmal: könnten wir die Diskussion damit bitte abhaken?

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo Rolf,

              Um die Deutungsambivalenz für das Minus zu beseitigen, habe ich ein Posting hinterhergeschickt.

              das ist ja genau das, was Gunnar oft fordert: Bewerten, dann aber auch begründen.
              Deswegen verstehe ich nicht, warum er so darauf rumreitet.

              Auch hier nochmal: könnten wir die Diskussion damit bitte abhaken?

              +1

              Einen schönen Tag noch
               Martin

              --
              "Malen nach Zahlen" sagten wir im Matheunterricht, wenn es bei der Kurvendiskussion hieß: Zeichnen Sie den Graphen der Funktion ...
            2. @@Rolf B

              ich bin ganz froh, dass andere meine Verteidigung übernommen haben.

              Du warst nie angeklagt.

              das Minus gab es von mir, weil dein Weder-noch-noch davor den Eindruck erweckte, alle drei Varianten seien als solches unbrauchbar

              Du hättest einen Punkt, wenn ich zwischen „Weder so noch so noch so“ und „Nicht err, sondern error“ einen Absatzumbruch gesetzt hätte.

              Das habe ich aber nicht – eben um deutlich zu machen, dass sich „Weder so noch so noch so“ nicht auf alle deine drei Varianten bezieht, sondern auf das unmittelbar(!!!) nachfolgende „Nicht err, sondern error“.

              Was hätte ich noch tun sollen? Den Satz nicht beenden, sondern ohne Punkt und Komma schreiben?

              Typografie kann Leben retten. Meins offenbar nicht. 🤷‍♂️

              🖖 Живіть довго і процвітайте

              --
              „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
              — @Grantscheam auf Twitter
              1. Hallo Gunnar,

                Was hätte ich noch tun sollen? Den Satz nicht beenden, sondern...

                ...weglassen. Sein Rundumschlag hat die unspezifische Verdammnis erzeugt und die Aussage wäre ohne ihn genauso machbar gewesen. Wie der Mitleser um 14:40 demonstriert hat, leider zusammen mit einem völlig unnötigen ad hominem.

                Rolf

                --
                sumpsi - posui - obstruxi
                1. @@Rolf B

                  Was hätte ich noch tun sollen? Den Satz nicht beenden, sondern...

                  ...weglassen. Sein Rundumschlag hat die unspezifische Verdammnis erzeugt und die Aussage wäre ohne ihn genauso machbar gewesen.

                  Zu meiner Verteidigung möchte ich anführen, dass der Satz dazu diente anzuzeigen, dass das err in allen deinen drei Varianten enthalten war. 😉

                  🖖 Живіть довго і процвітайте

                  --
                  „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
                  — @Grantscheam auf Twitter
      2. Weder so noch so noch so. Nicht err, sondern error.

        M.E. unfassbar, so auf Rolfs ausführliche und wertschätzende Antwort zu reagieren. Wenn Du auf Deinem sonst so „geliebten e“ rumgeritten wärst: trotzdem im Tonfall vergriffen, wenn auch wenigstens inhaltlich irgendwie noch nachvollziehbar.

        Bei „err“ vs „error“ bin ich persönlich aber raus.

        1. @@Mitleser 2.0

          Weder so noch so noch so. Nicht err, sondern error.

          M.E. unfassbar, so auf Rolfs ausführliche und wertschätzende Antwort zu reagieren. … im Tonfall vergriffen

          „Weder … noch … Nicht so, sondern so.“ Wo genau ist das „im Tonfall vergriffen“?

          Das war eine rhetorische Frage; die will ich gar nicht beantwortet haben, denn …

          Bei „err“ vs „error“ bin ich persönlich aber raus.

          … bei deiner Art von political correctness bin ich raus.

          🖖 Живіть довго і процвітайте

          --
          „Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“
          — @Grantscheam auf Twitter