如何使用自定义实现覆盖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) { } });