2016-09-02 4 views
4

Mit diesem Code:Fetch löst auch wenn 404?

fetch('notExists') // <---- notice 
    .then(
     function(response) 
     { 
      alert(response.status) 
     } 
    ) 
    .catch(function(err) 
    { 
     alert('Fetch Error : ', err); 
    }); 

Dieses Versprechen löst .

mdn

Es gibt ein Versprechen, das auf diese Anforderung an die Reaktion löst, ob es erfolgreich ist oder nicht.

Ist es nicht seltsam, dass eine fehlgeschlagene Ajax-Anfrage gelöst wird, selbst wenn sie auf eine nicht vorhandene Ressource geht?

Ich meine - was als nächstes? ein fetch zu einem Server, der nicht erreichbar ist und immer noch ein gelöstes Versprechen bekommen?

Ich weiß, dass ich an dem ok Eigentum an dem response Objekt untersuchen kann, aber immer noch -

Frage

Warum wird für eine völlig schlechte Anfrage (nicht vorhandene Ressource) aufgelöst haben holen.

BTW , jquery request , does get rejected

+3

Es hat zu lösen, so können Sie den Fehlercode verarbeiten. – Barmar

+0

@Barmar Also warum nicht auf den Fang/Reject-Handler? –

+0

Erwarten Sie, dass die Autoren des Abrufstandards antworten? Weil sie diejenigen sein würden, die dies ohne Spekulation beantworten könnten. –

Antwort

7

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.

+0

Naja, ich weiß, dass es keinen Platz zum Vergleichen gibt, aber '$ .ajax' zu' // a' wird abgelehnt. http://jsbin.com/pukurolego/1/edit?html,js,output –

+0

@RoyiNamir - Ich glaube nicht, du bist Jsbin Beispiel tut, was Sie denken, dass es ist. Wenn ich 'console.log()' den Zurückweisungsfehler sehe, sehe ich das 'Fehler beim Laden der Ressource: net :: ERR_ADDRESS_UNREACHABLE http: // 0.0.0.22 /'. Ich weiß nicht genau, wie sich jQuery verhält, aber deine jsbin testet nicht das Richtige. – jfriend00

+0

Sie haben Recht, mein Schlechter, habe es nicht gesehen. Ich brauche eine Pause . –

1

Reject-Handler für die Vernetzung und CORS Fehler iirc ist. Wenn die Anfrage den Server erreicht und dieser mit einer gültigen http-Antwort antwortet, wird die Zusage erfüllt, auch wenn die Antwort den Code 4xx oder 5xx hat.

0

Verwenden Sie diesen Code ...

fetch(`https://fercarvo.github.io/apps/integradora/DB/corpus.json`) 
.then(async (data) => { 
    if (data.ok) { 
     data = await data.json() 
     //Here you have your data... 
    } 
}).catch(e => console.log('Connection error', e)) 
Verwandte Themen