如何使用自定义实现覆盖jQuery ajax函数以进行错误回调

我想用错误回调的自定义实现覆盖jQuery ajax函数,以便在某些特定错误的情况下,调用不会传输到ajax调用的错误块。
我想要做的是,在自定义实现中,我将检查状态,如果匹配,我将不会调用原始error handling程序。

找到了答案

(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的);

我今天遇到了这个问题并决定我应该改进@Varun的答案来处理消费者使用延迟设置error handling程序而不是回调的情况。 以下是我提出的处理这两种情况的方法:

 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有覆盖全局ajax处理程序的方法。 例如,如果要响应自定义错误代码,则可以覆盖ajaxComplete,检查状态,并调用自定义error handling程序或默认error handling程序。

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

或者覆盖ajaxError并执行自己的error handling逻辑:

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

我希望这有帮助!

如果有任何服务器端错误,控件肯定会转到错误callBack。 您可以在此方案中执行的操作是根据您的意愿过滤您要执行的操作。

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

如果要为将来的所有Ajax请求设置errorHandler,请参阅ajaxSetup https://api.jquery.com/jquery.ajaxsetup/

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

或者,如果你想为一个电话做:

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