2010-05-04 62 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) { 
    // ... 
});