2010-12-03 22 views
19

ramificando fuera de preguntas como this one, estoy buscando ajustar el método $ .ajax() de jQuery de modo que pueda proporcionar el manejo de errores en una ubicación, que luego ser utilizado automáticamente por todas las llamadas remotas de una aplicación.

El enfoque simple sería simplemente crear un nuevo nombre, similar a cómo $ .get() y $ .post() implementan fachadas en $ .ajax(). Sin embargo, espero reutilizar el nombre $ .ajax(), de modo que podamos mantener el resto de nuestro código utilizando la sintaxis estándar de jQuery, ocultando el hecho de que hemos agregado nuestro propio manejo de errores. ¿Es práctico y/o bueno de lograr, o posiblemente una idea horrible?

EDITAR: Las respuestas hasta ahora indican .ajaxError() es el camino a seguir. Sé que esto atrapará errores de nivel de 400 y 500, pero ¿hay alguna manera (con este controlador de eventos u otro) de atrapar 302 redirecciones también? Estoy tratando de manejar las respuestas que están redireccionando a una página de inicio de sesión, pero queremos interceptar esa redirección cuando se trata de una solicitud XHR, lo que permite al usuario cancelar la acción en lugar de forzarlos a reenviar automáticamente.

+0

En una nota lateral, las respuestas a la no las solicitudes AJAX registradas probablemente retornarán 401 en lugar de 302. De todos modos, hay que pensar. – gtd

Respuesta

26

Es posible que desee mirar $.ajaxError.

$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) { 
    alert("There was an ajax error!"); 
}); 

jQuery proporciona a whole bunch of other ways to attach global handlers.

Para responder a su edición, puede atrapar solicitudes exitosas de ajax con $.ajaxSuccess, y puede ver todas (exitosas y fallidas) con $.ajaxComplete. Puede obtener el código de respuesta del parámetro xhr, como

$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) { 
    alert("Ajax request completed with response code " + xhr.status); 
}); 
+0

@Marc L: editado para que coincida con su información adicional. Además, puede encontrar esto interesante: http://stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call – sje397

+2

Pruebe '$ (document) .ajaxError (...); '- usando' $.ajaxError (...) 'no funcionó para mí. – ripper234

2

En realidad, jQuery ofrece el gancho, .ajaxError() sólo para este propósito. Todos y cada uno de los controladores que haya enlazado con $ajaxError() se invocarán cuando una solicitud de ajax de la página finalice con un error. La especificación de un selector le permite hacer referencia al this dentro de su controlador .ajaxError().

Para usarlo para manejar todos los errores petición Ajax en la página y usar this para apuntar a document, se podría hacer algo como esto:

$(document).ajaxError(function(event, request, settings){ 
    alert("Error requesting page: " + settings.url); 
}); 
+0

Para aclarar, ajaxError maneja TODOS los errores ajax, no solo aquellos que coinciden con el selector. Usar un selector solo le permite usar la palabra clave 'this' dentro de la devolución de llamada para referirse a ese elemento. –

0

Creo que es una mala idea. Creo que envolver $.ajax está bien, pero estás hablando de redefinir. Cualquiera que no se dé cuenta de esto obtendrá resultados inesperados.

Como han mencionado otros, atar un manipulador a $.ajaxError es el camino a seguir.

0

jQuery tiene un método práctico llamado $ .ajaxSetup() que le permite establecer opciones que se aplican a todas las solicitudes AJAX basadas en jQuery que vienen después. Mediante la colocación de este método en su función principal documento listo, todos los ajustes se aplicarán al resto de sus funciones de forma automática y en un solo lugar

$(function() { 
    //setup ajax error handling 
    $.ajaxSetup({ 
     error: function (x, status, error) { 
      if (x.status == 403) { 
       alert("Sorry, your session has expired. Please login again to continue"); 
       window.location.href ="/Account/Login"; 
      } 
      else { 
       alert("An error occurred: " + status + "nError: " + error); 
      } 
     } 
    }); 
}); 

Referencia: https://cypressnorth.com/programming/global-ajax-error-handling-with-jquery/

Cuestiones relacionadas