包装jQuery的$ .ajax()方法来定义全局error handling

从像这样的问题分支出来,我想要包装jQuery的$ .ajax()方法,以便我可以在一个位置提供error handling,然后由所有应用程序的远程调用自动使用。

简单的方法是简单地创建一个新名称,类似于$ .get()和$ .post()如何实现$ .ajax()的外观。 但是,我希望重用名称$ .ajax(),以便我们可以使用标准的jQuery语法保留其余的代码,从中隐藏我们添加了自己的error handling的事实。 这是实际的和/或好的实现,或者可能是一个可怕的想法?

编辑:到目前为止的响应表明.ajaxError()是要走的路。 我知道这将捕获400和500级别的错误,但有没有办法(使用此事件处理程序或其他方式)捕获302重定向? 我正在尝试处理重定向到登录页面的响应,但我们希望在它是XHR请求时拦截该重定向,允许用户取消操作而不是强制它们自动转发。

您可能想要查看$.ajaxError

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

jQuery提供了许多其他方法来附加全局处理程序 。

要回答您的编辑,您可以使用$.ajaxSuccess捕获成功的ajax请求,并且可以使用$.ajaxSuccess捕获所有(成功和失败)。 您可以从xhr参数中获取响应代码,例如

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

实际上,jQuery提供了钩子, .ajaxError()就是为了这个目的。 当页面的ajax请求因错误而完成时,将调用与$ajaxError()绑定的任何和所有处理程序。 指定选择器允许您在.ajaxError()处理程序中引用this

要使用它来处理页面上的所有ajax请求错误并使用this来指向document ,您可以执行以下操作:

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

jQuery有一个方便的方法叫做$ .ajaxSetup(),它允许你设置适用于它之后的所有基于jQuery的AJAX请求的选项。 通过将此方法放在主文档就绪function中,所有设置将自动应用于其余function并位于一个位置

 $(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); } } }); }); 

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

我认为这是一个坏主意。 我认为包装$.ajax很好,但你在谈论重新定义它。 任何没有意识到这一点的人会得到意想不到的结果

正如其他人所提到的,将处理程序绑定到$.ajaxError$.ajaxError的方法。