Ajax:如何防止jQuery在执行xmlHttpRequest.abort()之后调用success事件;

使用jQuery的$ .ajax()函数。 如果请求被故意中止,或者如果服务器关闭(没有响应),则会出现相同的结果;

也就是说,在xmlHttpRequest.status = 0xmlHttpRequest.readyState = 4的情况下触发“成功”处理程序。

(我通过关闭IIS模拟失败的请求,然后针对已经“关闭”的网站执行xmlHttpRequest)

所以我的问题是如何确定中止请求或由于服务器没有响应而导致真正失败的请求(因为服务器可能已关闭)之间的区别,因为两种情况似乎都给我相同的状态/ readyState?

编辑更准确我想知道如何在ajax上调用.abort()函数后阻止调用“success”处理程序。

我已经重新措辞,以反映这一点。

jQuery <1.5

对于jQuery <1.5,我提出了以下解决方案:

var request = $.ajax( /* ... */ ); // ... request.onreadystatechange = function () {}; request.abort(); 

所以,基本上我所做的是在调用abort()之前删除 success回调处理程序。

这就像一个魅力。

jQuery> = 1.5:

从jQuery 1.5开始, $.ajax(), $.get(), … jXHR $.ajax(), $.get(), …函数返回jXHR对象( api文档 )而不是xmlHttpRequest对象。 因此,您不能简单地覆盖xmlHttpRequest.onreadystatechange()处理程序。

jXHR.abort()jXHR.abort()负责不调用success回调处理程序。 因此,调用jXHR.abort()就足够了。

您确实不需要更新以前的代码,因为将onreadystatechange设置为jXHR根本就没有效果。

长话短说,从jQuery 1.5开始 ,这将做:

 var jxhr = $.ajax( /* ... */ ); // ... jxhr.abort(); 

只有一个请求的最佳解决方案是将$ .ajax调用的返回值分配给变量,例如currentRequest,然后在success(data, responseCode, xhr)函数内,检查if(xhr == currentRequest)和如果检查失败则提早返回。 在中止时,只需将currentRequest设置为null以便检查失败。

这样可以确保永远不会处理旧请求,如果您进行长轮询并在请求完成后立即重新启动请求,这一点尤为重要(由于请求已中止,您实际上不希望两个“轮询器”同时运行一个新的)。

您应该设置一个error handling程序,如果请求失败将被调用。 如果要在服务器上中止请求,可以返回一些可以在成功处理程序中检查的值,或者可以从服务器中抛出exception。 jquery.ajax()

编辑:你可能想看看这个AJAX队列/缓存/中止/块管理器v.2.0( 链接 )。 它允许您在请求中止后运行一个函数。

我注意到了这种相同的行为,并且request.onreadystatechange = function(){}; 在调用之前.abort()确实解决了这个问题。

您可以在xmlHttpRequest.abort周围的包装中单独跟踪中止。

什么时候中止叫。 我刚刚在firebug控制台中测试了以下内容

 var req = $.ajax({url:"localaddress", success:function(){alert("evil");}}); req.abort(); 

即在请求后立即中止,不会触发成功。