我有一个使用getJSON的跨域长轮询请求,回调看起来像这样:
$.getJSON("http://long-polling.com/some.fcgi?jsoncallback=?"
function(data){
if(data.items[0].rval == 1) {
// update data in page
}
});
问题是对长轮询服务的请求可能需要一段时间才能返回,并且在此期间可能会发出另一个getJSON请求并更新页面,即使它是陈旧的响应。
REQ1: h ** p://long-polling.com/some.fcgi at 上午10:00
REQ2: ^ h ** P://long-polling.com/some.fcgi?在 上午10:01
Req1返回并更新数据 页面上午10:02
如果已经制作了Req2,我想要一种方法来使Req1的返回无效。
谢谢!
答案 0 :(得分:7)
我认为这不起作用,因为getJSON使用JSONP方法,它实际上通过动态插入浏览器执行的脚本标记来工作。我认为没有办法阻止浏览器执行脚本......是吗?
答案 1 :(得分:5)
当你发出ajax请求时,它返回XMLHttpRequest对象。如果您想要abort
来电,可以在其上调用.abort()
方法。
var request = $.getJSON(. . . . . );
request.abort();
答案 2 :(得分:1)
正如@NewToDB所提到的,你无法取消jsonp请求(例如告诉浏览器停止尝试加载标记的src),但是你可以实现一种有效忽略旧调用的返回数据的机制。定义一个全局变量,每次进行jsonp调用时该变量都会递增,并将该变量的值作为参数传递给服务器。您还需要从服务器传回计数器(我假设您也拥有服务器代码)。如果您的计数器的当前值不等于返回的计数器值,那么您知道已经进行了另一个服务器调用,因此您可以忽略返回的数据。
// Global counter
var callCounter = 0;
...
$.getJSON("http://long-polling.com/some.fcgi?callCounter=" + (++callCounter) + "&jsoncallback=?"
function(data){
if(data.items[0].rval == 1 && data.callCounter == callCounter) {
// update data in page
}
});
答案 3 :(得分:0)
我使用全局变量来执行此类任务。这不是一个很好的方法,但最简单的方法。
if (typeof(myFooRequest) == 'object') {
myFooRequest.abort();
myFooRequest = false;
}
myFooRequest = $.get("/url", function(data) {
// ...
});