2012-02-27 98 views
15

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

我的代码看起来是这样的:

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

那么,如何避免错误()处理器射击时的HTTP状态代码是401?

感谢您的阅读!

+2

我不知道这将是值得请求jQuery开发团队,使它所以当你返回false在“的StatusCode”处理程序将防止AJAX事件传播到'错误'处理程序。当然,这不需要太多的努力,同时使编写未经身份验证的请求都具有相同全局处理程序的应用程序变得更加容易,即:将用户返回到登录屏幕的一个功能。 – 2012-10-31 21:06:48

+0

@JoshMc:好主意! – David 2014-04-22 13:26:27

回答

6

没有黑客jQuery.ajax,你不能。对我而言,jQuery的ajax方法是图书馆的痛处之一。为了更明智的请求处理,我建议您查看superagent或其他独立库。

+0

虽然不是我想要听到的,但我想尽可能接近我的答案。谢谢。 – 2012-03-25 10:56:49

10

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

E.g.

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

    } 
} 
+0

是的,但我希望避免不必像我在原始文章中提到的那样破解错误处理程序。从我的理解,这不能做到这一点,我觉得有点奇怪... – 2012-03-25 10:54:47

+0

@LeeFrancis,哦,我明白你的意思了。难道你不能只写一个使用$ .ajax调用的包装器。然后,您可以指定要在错误处理程序中抑制哪些状态代码?我为所有ajax调用编写了封装器,所以我可以在一个地方做任何调整。只是一个想法... – 2012-03-27 07:57:06

+0

是的,这或多或少是我最终做的。不过,当我无意中手动检查状态码时,我觉得我打算让图书馆预定义的处理程序可用(成功等)。 – 2012-03-27 12:12:23

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

在我的情况下,这个工作。

+0

非常好。但是,如果在错误处理程序中设置了由'$ .ajax'返回的延迟中的'fail()',它可以工作吗? – Francisc 2013-08-29 15:22:09

+0

我还没有尝试过,但根据jQuery jqXHR对象的回调执行顺序(失败前的错误,请参阅http://api.jquery.com/jQuery.ajax/),您可能可以修改函数中的延迟回调替换原来的settings.error。 – user2043553 2013-09-15 12:41:33

5

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

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

所以,你会得到:

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

} 
+0

这很聪明。 – Francisc 2013-08-29 13:26:30