jQuery ajax - 在调用statusCode()回调时避免error()回调

时间:2012-02-27 12:31:00

标签: jquery ajax error-handling http-status-codes

我正在使用jQuery.ajax()连接到我的后端服务。我已经配置了一个error()处理程序和一个statusCode()处理程序。它们都工作正常,但是当我的statusCode处理程序被触发时,错误处理程序也会触发(错误处理程序实际上是先触发)。我宁愿这不要发生。我假设这是可能的,而不必破解错误处理程序代码?

我的代码看起来像这样:

$.ajax({
    ...
    error: function(...) { 
        // process a general type of error here
    },
    statusCode: {
        401: function() {
            // process a specific authentication failure
        }
    }                 
});

那么当HTTP状态代码为401时,如何避免error()处理程序触发?

感谢您好好阅读!

5 个答案:

答案 0 :(得分:12)

您可以轻松检查错误回调中的状态代码。第一个参数应该是XMLHttpRequest(或jqHXR,取决于您的jQuery版本)对象。相应地检查'status'属性以获取错误句柄的状态代码。

E.g。

error: function(a, b, c){
  if(a.status != 401){
    // handle other errors except authentication

  }
}

答案 1 :(得分:7)

没有黑客jQuery.ajax,你就不能。对我来说,jQuery的ajax方法是该库的痛点之一。为了更明智的请求处理,我建议您查看superagent或其他一些独立的库。

答案 2 :(得分:6)

改进之前需要对您不想触发通用事件处理程序的状态代码进行硬编码的变通方法。

在我看来,编辑错误处理程序更安全,因为beforeSend可能会被覆盖以用于其他目的,因此您可能无意中在这些调用上触发了通用错误处理程序。 (如果有人覆盖了错误回调,他们希望它会影响错误处理,如果他们修改了beforeSend回调则不会)。

所以你会得到:

function ajaxError (jqXHR, textStatus, errorThrown)
{
    if (jqXHR.status in this.statusCode) return;
    // Handle generic events here.

}

答案 3 :(得分:2)

您可以尝试使用ajaxSetup和beforeSend自动调整ajax请求的错误处理程序:

$.ajaxSetup({
  beforeSend: function(jqXHR, settings) {
    if (typeof settings.error === 'function') {
      var errorfunc = settings.error;
      settings.error = function(jqXHR2, textStatus, errorThrown) {
        if (jqXHR2.status !== 401) errorfunc(jqXHR2, textStatus, errorThrown);
      };
    }
  }
});

就我而言,这是有效的。

答案 4 :(得分:0)

使用错误方法查看本文中有关处理状态代码的答案:how to get jquery ajax status code