fetch: Ablehnen, Versprechen mit JSON-Objekt Fehler
Habe ich eine HTTP-API gibt JSON-Daten sowohl bei Erfolg und bei Misserfolg.
Beispiel scheitern würde wie folgt Aussehen:
~ ◆ http get http://localhost:5000/api/isbn/2266202022
HTTP/1.1 400 BAD REQUEST
Content-Length: 171
Content-Type: application/json
Server: TornadoServer/4.0
{
"message": "There was an issue with at least some of the supplied values.",
"payload": {
"isbn": "Could not find match for ISBN."
},
"type": "validation"
}
Was ich erreichen will in meinem JavaScript-code ist so etwas wie dieses:
fetch(url)
.then((resp) => {
if (resp.status >= 200 && resp.status < 300) {
return resp.json();
} else {
//This does not work, since the Promise returned by `json()` is never fulfilled
return Promise.reject(resp.json());
}
})
.catch((error) => {
//Do something with the error object
}
Du meinst
Ja, als pro die
json
Methode gibt eine Promise
?Ja, als pro die
fetch
spec aus der Arbeitsgruppe: fetch.spec.whatwg.org/#concept-body-consume-bodyInformationsquelleAutor jbaiter | 2015-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, die
resp.json
Versprechen wird erfüllt werden, nurPromise.reject
nicht warten und sofort lehnt mit einem Versprechen.Ich nehme an, dass Sie lieber wollen, tun Sie den folgenden:
(oder explizit geschrieben)
undefined is not a function
Fehler, aber mit dieser kleinen änderung funktioniert es 🙂Äh, sind Sie lazy loading ein Versprechen shim? Die native
Promise.reject
sollte nieundefined
.Der shim geladen wird beim starten der Anwendung, so dass es sollte nicht faul geladen. Ich kann auf
Promise.reject
Prima aus dem debugger, zu. Hier ist der vollständige trace:TypeError: undefined is not a function {stack: "TypeError: undefined is not a function↵ at reject (native)", message: "undefined is not a function"}
Bei ablehnen? Ah, es muss
.then(Promise.reject.bind(Promise))
.Nein,
json
ist ein Versprechen hier, und wir wollen nicht ablehnen, mit dem Versprechen aber mit seinem Ergebnis Wert.InformationsquelleAutor Bergi
Die Lösung oben von Jeff Posnick ist meine Lieblings-Weg, es zu tun, aber die Verschachtelung ist ziemlich hässlich.
Mit den neueren async/await syntax wir können es in einem eher synchronen Art und Weise suchen, ohne das hässliche Schachteln, die können schnell unübersichtlich werden.
Dies funktioniert, weil, eine async-Funktion gibt immer ein Versprechen und einmal haben wir uns die JSON-wir können dann entscheiden, wie Sie es zurückgeben, basierend auf der Antwort-status (mit Antwort.ok).
Würden Sie Fehler behandeln die gleiche Weise, als würden Sie in Jeff ' s Antwort, oder Sie konnte try/catch-oder sogar ein Fehlerbehandlung höherer Ordnung Funktion.
Ebenfalls lesenswert MDN - Prüfen, ob der Abruf erfolgreich war, warum wir dies tun haben, im wesentlichen eine fetch-Anfrage nur lehnt mit Netzwerk-Fehler, immer eine 404 ist nicht in einem Netzwerk-Fehler.
InformationsquelleAutor tomhughes