jQuery 全局 ajax 错误处理程序在“本地”之前触发

Posted

技术标签:

【中文标题】jQuery 全局 ajax 错误处理程序在“本地”之前触发【英文标题】:jQuery global ajax error handler fires before "local" one 【发布时间】:2013-08-31 16:47:36 【问题描述】:

我想全局处理401 错误,只在本地处理其他错误。 本地意味着在 AJAX 调用的 fail 处理程序内。

为此,我在document 上实现了一个ajaxError 处理程序。 但是,问题是本地fail 处理程序在全局处理程序之前触发。 所以全局处理程序里面的event.stopImmediatePropagation()是没用的。

我怎样才能使全局的首先被触发,从而完全阻止本地的触发。 谢谢。

【问题讨论】:

你不能不将所有 ajax 请求包装在一个辅助方法中,而是将 "global" 错误处理程序直接绑定到 jqXHR 并放弃全局 ajaxError 处理程序。即使这样,我也不确定你是否可以在没有更多工作的情况下阻止它到达额外的错误处理程序,因为这些在技术上不是事件。 这很烦人。如果它在本地侦听器之后触发,为什么还要有一个全局处理程序?...对于包装器来说已经太晚了。 不一定为时已晚。您可以在不实际更改方法名称的情况下创建包装器。 是的,但更简单的是找到我需要抑制的失败方法并将其所有代码包含在 if 语句中,在执行任何操作之前检查状态是否不是 401。但这是一种糟糕的方式。 您是否考虑过使用 statusCode 回调?这可以使用 ajaxSetup 全局分配。我不完全确定你是否可以阻止错误回调的发生,因为它仍然是一个延迟对象。它要么通过,要么失败。它也不能不这样做。 【参考方案1】:
    var statusCodeError = function(error) 
        throw new Error('--> Error code ' + error.status + ' on XMLHttpRequest');
    ;
    var settings = 
        type        : 'POST',
        url         : '/ajax-script.php',
        dataType    : 'json',
        context     : document.body,
        statusCode  : 
            404: statusCodeError,
            301: statusCodeError,
            302: statusCodeError,
            401: statusCodeError,
            500: statusCodeError
        , failure : statusCodeError
    ;

    $.ajaxSetup(settings);

【讨论】:

以上是关于jQuery 全局 ajax 错误处理程序在“本地”之前触发的主要内容,如果未能解决你的问题,请参考以下文章

使用 AngularJS 的全局 Ajax 错误处理程序

如何 jQuery Ajax 错误捕获和报告

Jquery Ajax 错误处理忽略中止

第一百七十四节,jQuery,Ajax进阶

Jquery AJAX 全局超时(整个应用程序)我正在使用 $.get 和 $.post(不能使用 $.ajax)

jQuery之Ajax--全局Ajax事件处理器