2010-10-25 12 views
11

He estado revisando la fuente para conocer la crítica sobre los métodos de éxito/fracaso de jQuery.ajax(). No se basa únicamente en el código de estado, parece que también involucra el tipo de datos.jQuery.ajax() llamadas de éxito/error cuando?

Siempre recurro a la escritura de manejadores de errores personalizados usando la función 'completa' de devolución de llamada.

Exactamente, ¿cuáles son los criterios para las llamadas de éxito/error?

+0

Aquí hay un ejemplo para crear errores personalizados: http://stackoverflow.com/questions/1637019/how-to-get-the-jquery-ajax-error-response-text – jantimon

Respuesta

10

como usted ha dicho, que depende del tipo de datos, script es especial, por ejemplo, el cheque es:

Para otras solicitudes Es comprueba lo siguiente:

Nota: Lo anterior es para jQuery 1.4.3, jQuery 1.4.2 y por debajo tenía un "éxito" adicional escenario where a response code of 0 was also "successful", esto se hizo porque Opera devuelve un 0 cuando es realmente a 304. Este es un comportamiento incorrecto, y el equipo de jQuery optó por drop support for this quirk, ya que causó falsos positivos en otros casos reales de códigos de respuesta 0.

+1

¡Gracias! Respuesta muy completa. Establecer el tipo de datos en 'texto' debe omitir el análisis de la respuesta (por lo tanto, suprimir posible 'parseerror')? Todavía me da un pequeño error, ¿alguna idea de cuál podría ser la causa de esto? – bjornl

+1

@bjornl - Se está comprobando el encabezado del tipo de contenido y, al encontrar "json" probablemente, intentará analizarlo si es así. –

+0

Content-Type está establecido en 'application/octet-stream'; es un protocolo REST – bjornl

0

Creo que se puede ver esto en el código jQuery en la línea de GitHub 394 y en:

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

En depende del código readyState recibe principalmente y una variable donde controla el tiempo de espera:

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; 
} 
} 
}; 
Cuestiones relacionadas