如何杀死旧的jsonp请求?

时间:2010-05-04 12:45:05

标签: jquery jsonp

我有一个使用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的返回无效。

谢谢!

4 个答案:

答案 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) {
  // ...
});