Estoy creando una utilidad ajax para interactuar con mis métodos de servidor. Me gustaría aprovechar jQuery 1.5+ métodos diferidos del objeto devuelto de la llamada jQuery.ajax(). La situación está siguiendo.jQuery jqXHR - cancelar llamadas encadenadas, desencadenar cadena de error
El método serverside siempre devuelve un objeto JSON:
{ success: true|false, data: ... }
La utilidad del lado del cliente inicia la llamada AJAX como esta
var jqxhr = $.ajax({ ... });
Y el problema área:
jqxhr.success(function(data, textStatus, xhr) { if(!data || !data.success) { ???? // abort processing, trigger error } }); return jqxhr; // return to caller so he can attach his own handlers
Así que la pregunta es cómo cancelar la invocación de todas las personas que llaman anexa éxito devoluciones de llamada de un disparador de su controlador de errores en el lugar mencionado con ????
?
La documentación dice que las listas de invocación de funciones diferidas son FIFO, por lo que mi controlador de éxito es definitivamente el primero.
** NOTA **: Esta respuesta está fechada en Feb '11, en ese momento jQuery estaba en v1.5. Las mejoras posteriores a jQuery hacen que esta respuesta sea redundante. Desde v1.6, la solución generalmente aceptada habría implicado 'diferido.pipe()' y de v1.8 'diferido.then()', en cuyo punto escribiríamos algo así como 'función makerequest() {return jqxhr.then (función (datos) {return (data && data.success)? jqxhr: $ .Deferred(). reject (nuevo Error ('AJAX data error')). promise();}); } ' –
Tan pronto como comencemos a devolver algo que no es igual a 'jqXHR' (como' $ .Deferred(). Promise' en la respuesta anterior), perdemos el acceso a la función '.abort()' del objeto 'jqXHR' original y podemos No aborte la solicitud antes de que se resuelva, si es necesario. –