2011-03-30 14 views
6

Puede estar fuera de curso, pero me preguntaba si es posible usar la funcionalidad JQuery prefilter y analizar los datos de respuesta en un Ajax Success y reenviar condicionalmente al controlador de eventos error en mis llamadas ajax en función de la existencia de ciertos elementos en mi JSON devuelto (mensajes de error).Uso del prefiltro AJAX de JQuery para inspeccionar los datos de respuesta y reenviar condicionalmente al manejador de eventos 'Error'

Sería bueno si esto se configurara globalmente para cualquier función ajax en la página.

Quizás esta no sea la mejor manera de hacerlo; si alguien tiene una idea alternativa, ¡por favor hágamelo saber!

El prefiltro:

//only run prefilter on ajax calls expecting JSON back in response, would this 
//be the right way to do this? 
$.ajaxPrefilter("json", function(options, originalOptions, jqXHR) { 
    jqXHR.success(function(data, textStatus, jXHR) { 
     if(hasErrors(data)) { 
      //forward to error event handler? 
     } 
    }); 
}); 

Ajax llamada:

$.ajax({ 
     type:  "POST", 
     data:  { 
        theData: "someData"      
       }, 
     url:  theUrl, 
     dataType: 'json', 
     cache: false,   
     success: function (data, textStatus, jqXHR) { 
        //do stuff on success 
       } 
     error: function (jqXHR, textStatus, errorThrown) { 
        //I want to do this stuff if data contains errors from server 
       } 
}); 

Muchas gracias!

Respuesta

12

Así es como lo hago: almaceno la función de éxito original (específica para cada solicitud), y luego adjunto otra devolución de llamada. Si no tenía errores, llamo a la devolución de llamada original:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    var originalSuccess = options.success; 

    options.success = function (data) { 
     if(hasErrors(data)) { 
      //forward to error event handler or redirect to login page for example 
     } 
     else { 
      if (originalSuccess != null) { 
       originalSuccess(data); 
      } 
     } 
    }; 
}); 
+0

Estaba usando el controlador personalizado después de cada devolución de llamada exitosa. Ahora vi $ .ajaxPrefilter en la API de jQuery y vi su respuesta. Me hiciste ganar tiempo. Gracias. – jsonx

+1

¡Esto es perfecto! Muchas gracias! – icats

+1

¿Cómo se 1. detiene todas las devoluciones de llamada '.done', y 2. ejecuta devoluciones de llamada' .fail', en el condicional 'hasErrors (data)'? Intenté 'jqXHR.reject()' pero terminé 'jqXHR.reject no es una función'. ¿Qué escribes exactamente en la sección condicional? – kenn

Cuestiones relacionadas