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

时间:2010-03-01 16:09:47

标签: jquery xmlhttprequest

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

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

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

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

修改 更准确地说,我想知道在ajax上调用.abort()函数后如何防止调用“success”处理程序。

我已经重新提出问题以反映这一点。

6 个答案:

答案 0 :(得分:8)

jQuery< 1.5

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

var request = $.ajax( /* ... */ );

// ...

request.onreadystatechange = function () {};
request.abort();

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

这就像一个魅力。

jQuery> = 1.5:

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

这就是说,jXHR.abort()负责不调用success回调处理程序。因此,只需拨打jXHR.abort()即可。

您无需更新以前的代码,因为将onreadystatechange设置为jXHR根本不会产生任何影响。

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

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

// ...

jxhr.abort();

答案 1 :(得分:3)

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

这确保永远不会处理旧请求,这对于例如长轮询并在请求完成后立即重新启动请求(您实际上不希望两个“轮询器”同时运行,因为请求启动了一个新请求)。

答案 2 :(得分:2)

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

修改  您可能需要查看此AJAX队列/缓存/中止/块管理器v.2.0(link)。它将允许您在请求中止后运行一个函数。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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