包装jquery的$.ajax()方法以定义全局错误处理

Wrap jQuery's $.ajax() method to define global error handling

从这类问题的分支中,我希望包装jquery的$.Ajax()方法,以便在一个位置提供错误处理,然后应用程序的所有远程调用都将自动使用它。

简单的方法是简单地创建一个新名称,类似于$.get()和$.post()如何实现$.ajax()的外观。不过,我希望重用名称$.ajax(),这样我们就可以使用标准jquery语法保留其余代码,从而避免了添加了自己的错误处理这一事实。这是可行的和/或很好的实现,还是可能是一个可怕的想法?

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


你可能想看看$.ajaxError

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

jquery提供了一系列附加全局处理程序的其他方法。

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

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


jquery有一个名为$.Ajaxsetup()的简便方法,它允许您设置应用于随后所有基于jquery的Ajax请求的选项。通过将此方法放置在主文档就绪功能中,所有设置都将自动应用于其他功能,并位于一个位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$(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/


实际上,jquery仅为此目的提供了hook,.ajaxError()。当来自页面的Ajax请求以错误完成时,将调用与$ajaxError()绑定的任何和所有处理程序。指定选择器允许您引用.ajaxError()处理程序内部的this

要使用它来处理页面上的所有Ajax请求错误,并使用this指向document,可以这样做:

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


我觉得这是个坏主意。我认为包装$.ajax是好的,但你是在说重新定义它。任何不知道这一点的人都会得到意想不到的结果。

正如其他人提到的,将一个处理程序绑定到$.ajaxError是一种可行的方法。