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

时间:2010-12-03 02:27:55

标签: jquery ajax custom-exceptions

分析this one之类的问题,我想要包装jQuery的$ .ajax()方法,以便我可以在一个位置提供错误处理,然后由所有应用程序的远程自动使用调用

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

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

4 个答案:

答案 0 :(得分:26)

您可能需要查看$.ajaxError

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

jQuery提供a whole bunch of other ways to attach global handlers

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

jQuery有一个名为$ .ajaxSetup()的方便方法,它允许您设置适用于所有基于jQuery的AJAX请求的选项。通过将此方法放入主文档就绪功能,所有设置将自动应用于其余功能,并在一个位置

$(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/

答案 3 :(得分:0)

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

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