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

如何使用错误回调的自定义实现覆盖jQuery ajax函数,jquery,ajax,Jquery,Ajax,我想用错误回调的自定义实现覆盖jQuery ajax函数,以便在出现某些特定错误时,调用不会转移到ajax调用的错误块。 我想做的是,在自定义实现中,我将检查状态,如果它匹配,我将不调用原始错误处理程序。jQuery有覆盖全局ajax处理程序的方法。例如,如果要响应自定义错误代码,可以覆盖ajaxComplete,检查状态,并调用自定义错误处理程序或默认错误处理程序 或者重写ajaxError并执行您自己的错误处理逻辑: 我希望这有帮助 如果有任何服务器端错误,控件肯定会转到错误回调。在这个

我想用错误回调的自定义实现覆盖jQuery ajax函数,以便在出现某些特定错误时,调用不会转移到ajax调用的错误块。

我想做的是,在自定义实现中,我将检查状态,如果它匹配,我将不调用原始错误处理程序。

jQuery有覆盖全局ajax处理程序的方法。例如,如果要响应自定义错误代码,可以覆盖ajaxComplete,检查状态,并调用自定义错误处理程序或默认错误处理程序

或者重写ajaxError并执行您自己的错误处理逻辑:


我希望这有帮助

如果有任何服务器端错误,控件肯定会转到错误回调。在这个场景中,您可以根据自己的意愿过滤要执行的操作

$.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

$.ajaxSetup({
    error: function(event, jqXHR, ajaxSettings, thrownError) {
        // this callback called always on all ajax request errors
    }
});
或者,如果您想只打一次电话:

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

    }
});
找到了答案

(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的答案,以处理消费者使用延迟来设置错误处理程序而不是回调的情况。以下是我处理这两种情况的方法:

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;