2010-10-25 8 views
11

Ich habe die Quelle durchsucht, um die Kriterien für die Erfolgsmethode von jQuery.ajax() zu ermitteln. Es basiert nicht ausschließlich auf dem Statuscode, scheint es auch den Datentyp zu beteiligen.jQuery.ajax() Erfolg/Fehler Callbacks wann aufgerufen?

Ich schreibe immer benutzerdefinierte Fehlerhandler mit dem 'Complete'-Callback schreiben.

Welche sind die Kriterien für die Erfolg/Fehler-Aufrufe?

+0

Hier ist ein Beispiel für die Erstellung von benutzerdefinierten Fehlern: http://StackOverflow.com/Questions/1637019/How-to-get-the-Jquery-ajax-error-response-text – jantimon

Antwort

10

Wie Sie gesagt haben, es hängt von dem Datentyp, script ein besonderes ist zum Beispiel, die Prüfung ist:

Für andere Anfragen ist es überprüft die folgenden:

Hinweis: Die oben ist für jQuery 1.4.3, jQuery 1.4.2 und unten hatte ein zusätzliches "Erfolg" Szenario where a response code of 0 was also "successful", dies getan wurde, weil Opera eine 0 zurückgibt, wenn es ist wirklich ein 304. Dies ist ein falsches Verhalten, und das jQuery-Team entschied sich für drop support for this quirk, da es in anderen tatsächlichen 0-Antwortcode-Fällen zu Fehlalarmen führte.

+1

Vielen Dank! Sehr umfassende Antwort. Wenn der dataType auf 'text' gesetzt wird, sollte die Analyse der Antwort umgangen werden (wodurch möglicher 'parseerror' unterdrückt wird)? Es gibt mir immer noch einen Fehler, irgendeine Idee, was könnte die Ursache dafür sein? – bjornl

+1

@bjornl - Es überprüft die Content-Typ-Header und Suche nach "Json" am wahrscheinlichsten, wird es versuchen, es zu analysieren, wenn ja. –

+0

Der Inhaltstyp ist auf 'application/octet-stream' eingestellt - es ist ein REST-Protokoll – bjornl

0

Ich glaube, Sie dies in der jQuery-Code in Github Linie 394 und sehen:

http://github.com/jquery/jquery/blob/master/src/ajax.js

In hängt von der Sie in erster Linie erhalten Readystate-Code und eine Variable, wo er das Timeout steuert:

var onreadystatechange = xhr.onreadystatechange = function(isTimeout) { 
// The request was aborted 
if (!xhr || xhr.readyState === 0 || isTimeout === "abort") { 
// Opera doesn't call onreadystatechange before this point 
// so we simulate the call 
if (!requestDone) { 
jQuery.handleComplete(s, xhr, status, data); 
} 

requestDone = true; 
if (xhr) { 
xhr.onreadystatechange = jQuery.noop; 
} 

// The transfer is complete and the data is available, or the request timed out 
} else if (!requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout")) { 
requestDone = true; 
xhr.onreadystatechange = jQuery.noop; 

status = isTimeout === "timeout" ? 
"timeout" : 
!jQuery.httpSuccess(xhr) ? 
"error" : 
s.ifModified && jQuery.httpNotModified(xhr, s.url) ? 
"notmodified" : 
"success"; 

var errMsg; 

if (status === "success") { 
// Watch for, and catch, XML document parse errors 
try { 
// process the data (runs the xml through httpData regardless of callback) 
data = jQuery.httpData(xhr, s.dataType, s); 
} catch(parserError) { 
status = "parsererror"; 
errMsg = parserError; 
} 
} 

// Make sure that the request was successful or notmodified 
if (status === "success" || status === "notmodified") { 
// JSONP handles its own success callback 
if (!jsonp) { 
jQuery.handleSuccess(s, xhr, status, data); 
} 
} else { 
jQuery.handleError(s, xhr, status, errMsg); 
} 

// Fire the complete handlers 
if (!jsonp) { 
jQuery.handleComplete(s, xhr, status, data); 
} 

if (isTimeout === "timeout") { 
xhr.abort(); 
} 

// Stop memory leaks 
if (s.async) { 
xhr = null; 
} 
} 
}; 
Verwandte Themen