Come sovrascrivere la funzione jQuery ajax con un’implementazione personalizzata per la callback degli errori

Voglio sovrascrivere la funzione jQuery ajax con un’implementazione personalizzata per la callback degli errori, in modo che in caso di alcuni errori specifici la chiamata non venga trasferita al blocco errori della chiamata ajax.
Voglio che sto pensando di fare che nell’implementazione personalizzata controllerò lo stato e se corrisponde non chiamerò il gestore degli errori originale.

Ho trovato la risposta

(function($){ // Save reference to actual jQuery ajax function var $_ajax = $.ajax; $.ajax = function(options){ if (options.error) { // save reference to original error callback var originalErrorHandler = options.error; var errorHandlerContext = options.context ? options.context : $; // define a custom error callback var customErrorHandler = function(xhr,status,error) { if(error != 'Some error'){ // call original error callback originalErrorHandler.apply(errorHandlerContext, arguments); } }; // override error callback with custom implementation options.error = customErrorHandler; }; // call original ajax function with modified arguments $_ajax.apply($, arguments); }; 

}) (JQuery);

Mi sono imbattuto in questo problema oggi e ho deciso che dovrei migliorare la risposta di @ Varun per gestire il caso in cui l’utente utilizza il differito per impostare il gestore degli errori anziché il callback. Ecco cosa mi è venuto in mente per gestire entrambi i casi:

 var oldAjax = $.ajax; var newAjax = function (options) { var originalErrorHandler = options.error; var errorHandlerContext = options.context ? options.context : $; var customErrorHandler = function (xhr, status, error) { if (xhr.status === 401) { //do something } else if (xhr.status === 403) { //do something } else { if (originalErrorHandler) { originalErrorHandler.apply(errorHandlerContext, arguments); } } }; if (options.error) { options.error = customErrorHandler; }; var deferred = oldAjax.apply($, arguments).error(customErrorHandler); var addErrorHandler = deferred.error; deferred.error = function (localHandler) { var newLocalHandler = function (xhr) { if (xhr.status !== 401 && xhr.status !== 403) { localHandler.apply(localHandler, arguments); } }; addErrorHandler.call(addErrorHandler, newLocalHandler); return deferred; }; return deferred; }; $.ajax = newAjax; 

jQuery ha modi per ignorare i gestori globali di ajax. Se si desidera rispondere a codici di errore personalizzati, ad esempio, è ansible sovrascrivere ajaxComplete, controllare lo stato e chiamare un gestore errori personalizzato o il gestore errori predefinito.

https://api.jquery.com/ajaxComplete/

Oppure sovrascrivi ajaxError e fai la tua logica di gestione degli errori:

https://api.jquery.com/ajaxError/

Spero che questo possa essere d’aiuto!

Se c’è qualche errore sul lato server, il controllo passerà sicuramente all’errore callBack. Quello che puoi fare in questo scenario è filtrare l’azione che vuoi eseguire in base alla tua volontà.

 $.ajax({ error:function(jqXHR, textStatus, errorThrown){ if(errorThrown == "specificErrorYouLookingFor"){ // Do the special error handling you wish to do. }else{ // Do normal error handling. } } }) 

Vedi ajaxSetup https://api.jquery.com/jquery.ajaxsetup/ se vuoi impostare errorHandler per tutte le future richieste Ajax

 $.ajaxSetup({ error: function(event, jqXHR, ajaxSettings, thrownError) { // this callback called always on all ajax request errors } }); 

O se vuoi farlo per una chiamata:

 $.ajax({ // similar error: function(event, jqXHR, ajaxSettings, thrownError) { } });