pl: Verstehe einer Promises

problematische Seite

Hi,

im Fehlerfall kommt serverseitig status != 200, wie krieg ich da den Responsetext ausgegegen?

    fetch('%url%?fetch='+nr).then(function(response) {
        return response.status == 200 ? response.text() : 'Fehler: '+response.text();
    }).then(function( text ) {
        pretext(text);
    });

Wenn status == 200 ist, krieg ich den text, anderweitig jedoch [object Promise]

Bitte mal um Hinweise. MfG

  1. problematische Seite

    Tach!

    im Fehlerfall kommt serverseitig status != 200, wie krieg ich da den Responsetext ausgegegen?

        fetch('%url%?fetch='+nr).then(function(response) {
            return response.status == 200 ? response.text() : 'Fehler: '+response.text();
        }).then(function( text ) {
            pretext(text);
        });
    

    Wenn status == 200 ist, krieg ich den text, anderweitig jedoch [object Promise]

    Wenn du ein Promise siehst, dann ist das der Rückgabewert von fetch() oder then(). Innerhalb der then()-Callbacks bekommst du das Promise-Objekt nicht übergeben.

    Außerdem wird bei Netzwerkfehlern (404 gehört nicht dazu, das ist eine normale HTTP-Antwort) das Promise nicht erfüllt und die Callbacks in then() werden nicht aufgerufen. Auf Netzwerkfehler kannst du im catch()-Callback reagieren.

    dedlfix.

    1. problematische Seite

      hi,

      Außerdem wird bei Netzwerkfehlern (404 gehört nicht dazu, das ist eine normale HTTP-Antwort) das Promise nicht erfüllt und die Callbacks in then() werden nicht aufgerufen. Auf Netzwerkfehler kannst du im catch()-Callback reagieren.

      Das wäre meine nächste Frage, was übergebe ich new Error(response) oder new Error(response.text()) ich hab beides probiert, erhalte jedoch in err.messgage wiederum nur ein Promise Objekt.

      Wie komme ich an den Text? In der Response ist er ja wie ein Blick in die Konsole zeig.

      Danke im Vorab.

      1. problematische Seite

        Tach!

        Außerdem wird bei Netzwerkfehlern (404 gehört nicht dazu, das ist eine normale HTTP-Antwort) das Promise nicht erfüllt und die Callbacks in then() werden nicht aufgerufen. Auf Netzwerkfehler kannst du im catch()-Callback reagieren.

        Das wäre meine nächste Frage, was übergebe ich new Error(response) oder new Error(response.text()) ich hab beides probiert, erhalte jedoch in err.messgage wiederum nur ein Promise Objekt.

        Wenn du nicht aus der Dokumentation zu fetch() entnehmen möchtest, wo genau du hingreifen musst, um deine gewünschten Daten zu bekommen, dann kann console.log() helfen, das was du da übergeben bekommst zu analysieren.

        Du solltest aber erstmal sagen, welche Art von Fehler du abzufangen zu gedenkst. Ist es eine normale HTTP-Response mit Statuscode oder ein Netzwerkfehler?

        Das was du da fängst, ist vermutlich nicht das was du im then() geworfen hast, sondern etwas, das von fetch() geworfen wurde. Das Promise müsste dann auch im Status rejected sein (siehe Ausgabe von console.log(dein_promise)).

        dedlfix.

        1. problematische Seite

          Tach!

          Du solltest aber erstmal sagen, welche Art von Fehler du abzufangen zu gedenkst. Ist es eine normale HTTP-Response mit Statuscode oder ein Netzwerkfehler?

          Es ist eine normale HTTP Response mit Statuscode 502. Siehe auch problematische Seite die ich extra dafür hingestellt habe. MfG

          1. problematische Seite

            Tach!

            Du solltest aber erstmal sagen, welche Art von Fehler du abzufangen zu gedenkst. Ist es eine normale HTTP-Response mit Statuscode oder ein Netzwerkfehler?

            Es ist eine normale HTTP Response mit Statuscode 502. Siehe auch problematische Seite die ich extra dafür hingestellt habe.

            Ah, jetzt, ja. Mit fetch() hab ich selbst noch nicht direkt gearbeitet und nicht richtig geschlussfolgert, was Response.text() da als Resultat bringt. Das bringt tatsächlich nicht den Inhalt der Response als Text, sondern selbigen in ein weiteres Promise verpackt. Der Inhalt ist also so nicht direkt nutzbar, sondern muss erst aufgelöst werden.

            Das Beispiel im MDN macht es sich einfach und wirft ein Error-Objekt mit neuem Text, ignoriert also den Body der Response.

            dedlfix.

            1. problematische Seite

              Moin,

              Das Beispiel im MDN macht es sich einfach und wirft ein Error-Objekt mit neuem Text, ignoriert also den Body der Response.

              Ja genau deswegen habe ich ja diesen Thread hier aufgemacht. Frage nochmal: Wie komme ich an den Text? MfG

              1. problematische Seite

                Tach!

                Ja genau deswegen habe ich ja diesen Thread hier aufgemacht. Frage nochmal: Wie komme ich an den Text?

                Die Antwort steckt bereits im nicht zitierten Teil: das response.text()-Promise auflösen. Oder genauer gesagt, dem Promise einen Callback spendieren, der vom Promise mit dem Text aufgerufen wird.

                dedlfix.

                1. problematische Seite

                  Tach!

                  Ja genau deswegen habe ich ja diesen Thread hier aufgemacht. Frage nochmal: Wie komme ich an den Text?

                  Die Antwort steckt bereits im nicht zitierten Teil: das response.text()-Promise auflösen. Oder genauer gesagt, dem Promise einen Callback spendieren, der vom Promise mit dem Text aufgerufen wird.

                  Ja das weiß ich auch schon. Wie spendiere ich dem promise ein Callback? Hast Du evntl. ein Code-Beispiel? MfG

                  1. problematische Seite

                    Tach!

                    Wie spendiere ich dem promise ein Callback? Hast Du evntl. ein Code-Beispiel?

                    Steht in deinem Ausgangsposting. fetch() liefert auch ein Promise, und wenn es aufgelöst wird, ruft es die Funktion auf, die der Methode then() übergeben wurde. Oder im Fehlerfall die Callback-Funktion der Methode catch().

                    dedlfix.

                    1. problematische Seite

                      Wir drehen uns im Kreis. Es geht ja gar nicht um den catch Zweitg sondern darum wie ich an den text komme. Das ist völlig unabhängig von Serverstatus und dass der Text am Browser ankommt ist in der console ja zu sehen.

                      Um das Problem zu verdeutlichen habe ich den Code mal umgeschrieben, siehe problematische Seite:

                          fetch('%url%?fetch='+nr).then(function(response) {
                              return {m: response.text(), s: response.status};
                          }).then(function( x ) {
                              console.log(x);
                          });
                      

                      und damit sehe ich in der console Object { m: Promise, s: 200 } oder Object { m: Promise, s: 502 } also auch beim status 200 ein Promise. Die Frage ist immernoch die wie ich hier nun ein callback reinbringe was das auflöst. MfG

                      1. problematische Seite

                        Tach!

                        Die Frage ist immernoch die wie ich hier nun ein callback reinbringe was das auflöst.

                        resonse.text().then(callback)

                        dedlfix.

                        1. problematische Seite

                          Tach!

                          Die Frage ist immernoch die wie ich hier nun ein callback reinbringe was das auflöst.

                          resonse.text().then(callback)

                          Ok, jetzt hab ichs endlich. Man muss es nur einmal anders schreiben und schon rappelts im Dachstübchen 😉

                          Denke!

  2. problematische Seite

    Die Antwort ist die Art und Weise der Fehlerbehandlung im Unterschied zu legacy ajax. Erläuterungen hier mit einer DEMO.

    Nochmal Danke und Schöne Grüße 😉

  3. problematische Seite

    Moin, Solange mit FetchAPI POST funktioniert, siehe Demo und es eine FileAPI gibt, ist auch das Hochladen von Dateien möglich. Das führt mich zwangsläufig zur Frage wie man da eine Progressbar einbauen kann. Hat da jemand mal ein Beispiel?

    Schönen Sonntag 😉