Ich möchte eine globale Fehlerbehandlungsmethode für Ajax-Aufrufe haben. Dies ist, was ich jetzt habe:
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
Ich muss den Fehler von ignorieren aborted
. errorThrown
ist null und textStatus
ist error
. Wie überprüfe ich aborted
?
jquery
ajax
error-handling
Shawn Mclean
quelle
quelle
abort
manuell anrufen (und ich bin nicht sicher, wann es sonst angerufen wird), können Sie die Fehlermeldung übergeben :abort("abort")
.Antworten:
Ich musste mich heute mit dem gleichen Anwendungsfall befassen. Die App, an der ich arbeite, hat diese lang laufenden Ajax-Aufrufe, die unterbrochen werden können durch 1) den Benutzer, der weg navigiert, oder 2) eine Art vorübergehenden Verbindungs- / Serverausfall. Ich möchte, dass der Fehlerbehandler nur für Verbindungs- / Serverfehler ausgeführt wird und nicht für den Benutzer, der weg navigiert.
Ich habe zuerst die Antwort von Alastair Pitts versucht, aber es hat nicht funktioniert, da sowohl abgebrochene Anforderungen als auch Verbindungsfehler den Statuscode und readyState auf 0 gesetzt haben. Als nächstes habe ich die Antwort von sieppl versucht. hat auch nicht funktioniert, da in beiden Fällen keine Antwort gegeben wird, also kein Header.
Die einzige Lösung, die für mich funktioniert hat, besteht darin, einen Listener für window.onbeforeunload festzulegen, der eine globale Variable festlegt, die angibt, dass die Seite entladen wurde. Der Fehlerbehandler kann dann den Fehlerbehandler nur dann überprüfen und aufrufen, wenn die Seite nicht entladen wurde.
var globalVars = {unloaded:false}; $(window).bind('beforeunload', function(){ globalVars.unloaded = true; }); ... $.ajax({ error: function(jqXHR,status,error){ if (globalVars.unloaded) return; } });
quelle
beforeunload
Handler ist benutzerdefiniert. Warum sollten Sie globalVars.unloaded auf setzen,true
wenn Sie das Entladen mit derselben Methode abbrechen möchten ?beforeunload
wird nicht aufgerufen, wenn der Benutzer zu einer anderen Seite navigiert oder zu spät angerufen wird?In der modernen jQuery können Sie einfach überprüfen, ob
request.statusText
Folgendes gleich ist'abort'
:error: function (request, textStatus, errorThrown) { if (request.statusText =='abort') { return; } }
quelle
Etwas, das ich gefunden habe, ist, dass, wenn es eine abgebrochene Anfrage gibt, die
status
und / oderreadyState
gleich ist0
.In meinem globalen Fehlerbehandler befindet sich oben in der Methode eine Überprüfung:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { //If either of these are true, then it's not a true error and we don't care if (jqXHR.status === 0 || jqXHR.readyState === 0) { return; } //Do Stuff Here });
Ich habe festgestellt, dass dies perfekt für mich funktioniert. Hoffe das hilft dir oder irgendjemand anderem, der darauf stößt :)
quelle
Sie sollten sich das textStatus-Argument ansehen, das an Ihre Fehlerfunktion übergeben wurde. Laut http://api.jquery.com/jQuery.ajax/ können die Werte "Erfolg", "Nicht geändert", "Fehler", "Zeitüberschreitung", "Abbruch" oder "Parsererror" angenommen werden. "Abbruch" ist offensichtlich das, gegen das Sie prüfen möchten.
Längere Hinweise hier: jquery-gotcha-error-callback-triggered-on-xhr-abort
quelle
Da die Antwort von bluecollarcoders bei Ajax-Anfragen, die durch Javascript abgebrochen wurden, nicht funktioniert, ist hier meine Lösung:
var unloaded = false; ... $(window).bind('beforeunload', function(){ unloaded = true; }); $(document).ajaxError(function(event, request, settings) { if (unloaded || request.statusText == "abort") { return; } ... }
z.B
handler = jQuery.get("foo") handler.abort()
wird jetzt vom AjaxError-Handler ignoriert
quelle
Aufbauend auf der Antwort von Alastair Pitts'a können Sie dies auch tun, um informativere Nachrichten zu erhalten:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { { if (jqXHR.status === 0) { alert('Not connect.\n Verify Network.'); } else if (jqXHR.status == 404) { alert('Requested page not found. [404]'); } else if (jqXHR.status == 500) { alert('Internal Server Error [500].'); } else if (exception === 'parsererror') { alert('Requested JSON parse failed.'); } else if (exception === 'timeout') { alert('Time out error.'); } else if (exception === 'abort') { alert('Ajax request aborted.'); } else { alert('Uncaught Error.\n' + jqXHR.responseText); } } });
quelle
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) { if (!jqXHR.getAllResponseHeaders()) { return; } });
quelle
Ich hatte hier das gleiche Problem, und als Lösung habe ich kurz vor dem Aufruf von abort () eine "aborting" -Vari festgelegt, wie folgt:
aborting = true; myAjax.abort();
und zeigen Sie den Fehler nur im Fehlerhandler der Ajax-Anforderung an, wenn der Abbruch nicht wahr ist.
$.ajax({ [..] error: function() { if ( !aborting ) { // do some stuff.. } aborting = false; } });
quelle
Wenn Sie die Ajax-Anforderung manuell abbrechen, können Sie Folgendes tun:
var xhr; function queryData () { if (xhr) { // tag it's been aborted xhr.hasAborted = true; // manually canceled request xhr.abort(); } xhr = $.ajax({ url: '...', error: function () { if (!xhr.hasAborted) { console.log('Internal Server Error!'); } }, complete: function () { xhr = null; } }); }
quelle