2010-05-04 57 views
6

我使用的getJSON有一个回调,看起来像这样的跨域长轮询请求:如何杀死一个较老的jsonp请求?

$.getJSON("http://long-polling.com/some.fcgi?jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1) { 
      // update data in page 
      } 
    }); 

的问题是请求长轮询服务可能需要一段时间才能恢复,而另一个的getJSON请求可能会在此期间进行并更新页面,即使它是一个陈旧的响应。

REQ1: ħ**号码://long-polling.com/some.fcgi在 10:00 AM

REQ2: ħ**号码://long-polling.com /some.fcgi?在 上午10:01

REQ1回报和更新上 数据的页面上午10:02

我想办法,如果REQ2已经取得从REQ1返回无效。

谢谢!

回答

5

当你发出ajax请求时,它返回XMLHttpRequest对象。如果您想拨打abort,您可以拨打.abort()方法。

var request = $.getJSON(. . . . .); 
request.abort(); 
+0

+1。即将给出同样的答案。 – Boldewyn 2010-05-04 13:27:00

+7

JSONP不使用XMLHttpRequest,它向页面中注入HTML

7

我不认为工作作为的getJSON使用JSONP方法实际上通过动态插入您的浏览器中执行该脚本标签工作。我不认为有什么办法可以阻止浏览器执行脚本......是吗?

+0

同意;看到这个问题的更多细节,http://stackoverflow.com/questions/4162261/i-cannot-stop-an-ajax-request-using-jquery-and-abort-function – goggin13 2011-06-23 15:53:35

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

我使用全局变量这样的任务。这不是一个很好的方法,但是最简单的方法。

if (typeof(myFooRequest) == 'object') { 
    myFooRequest.abort(); 
    myFooRequest = false; 
} 
myFooRequest = $.get("/url", function(data) { 
    // ... 
});