Ein Anruf fetch()
wird nur abgelehnt, wenn die Netzwerkanforderung selbst aus irgendeinem Grund fehlschlägt (Host nicht gefunden, keine Verbindung, Server antwortet nicht, etc ...).
Jedes Ergebnis vom Server (404, 500, etc ...) wird aus Sicht des Versprechens als erfolgreiche Anfrage betrachtet. Konzeptionell haben Sie eine Anfrage vom Server gestellt und der Server hat Sie so beantwortet, dass aus Sicht des Netzwerkes die Anfrage erfolgreich abgeschlossen wurde.
Sie müssen dann diese erfolgreiche Antwort testen, um zu sehen, ob der gewünschte Antworttyp vorhanden ist. Wenn Sie ein 404 sein eine Ablehnung möchten, können Sie Code, der sich selbst:
fetch('notExists').then(function(response) {
if (response.status !== 200) {
// make the promise be rejected if we didn't get a 200 response
throw new Error("Not 200 response")
} else {
// go the desired response
}
}).catch(function(err) {
// some error here
});
Sie könnten sogar machen Sie Ihre eigenen myFetch()
, die gerade dies automatisch tut (wandelt jede nicht-200 Antwortstatus zu einer Ablehnung).
Was ist der Grund für einen aufgelösten Versprechen für eine ganz schlechte Anfrage (nicht vorhandene Ressource/Server nach unten).
Zunächst einmal, Server-down wird keine erfolgreiche Antwort generieren - das wird ablehnen.
Eine erfolgreiche Antwort wird generiert, wenn Sie eine Verbindung zum Server herstellen, eine Anfrage senden und eine Antwort (Antwort) zurücksenden. Was "warum" die Designer der fetch()
Schnittstelle entschieden, die Ablehnung darauf zu stützen, ist es ein bisschen schwer zu sagen, ohne mit jemandem zu sprechen, der tatsächlich in das Design dieser Schnittstelle involviert war, aber es scheint mir logisch.Auf diese Weise teilt Ihnen die Ablehnung mit, ob die Anfrage angekommen ist und eine gültige Antwort erhalten hat. Es liegt an Ihrem Code zu entscheiden, was mit der Antwort zu tun ist. Sie können natürlich Ihre eigene Wrapper-Funktion erstellen, die dieses Standardverhalten modifiziert.
Es hat zu lösen, so können Sie den Fehlercode verarbeiten. – Barmar
@Barmar Also warum nicht auf den Fang/Reject-Handler? –
Erwarten Sie, dass die Autoren des Abrufstandards antworten? Weil sie diejenigen sein würden, die dies ohne Spekulation beantworten könnten. –