2013-01-31 69 views
1

我之前問了一下使用Ajax輪詢來自服務器的問題,使用下面的jQuery Ajax請求每3秒:如何退出jQuery的遞歸輪詢?

function getData() { 
    $.ajax({ 
     url : 'http://example.com', 
     type: 'GET', 
     success : function(data) { 
      // process data here 
      setTimeout(getData, 3000); 
     }, 
     dataType : 'json' 
    }); 
} 

看來,這樣做的另一種方式是把外面的setTimeout $。阿賈克斯()塊:

function getData() { 
    setTimeout(function() { 
    $.ajax({ 
     url : 'http://example.com', 
     type: 'GET', 
     success : function(data) { 
      //process data here 
     }, 
     dataType : 'json' 
    }) }, 3000); 
} 

那麼這兩種方法有什麼區別嗎?它們每三秒鐘有連續輪詢服務器的效果嗎?

而且,成功的回調函數裏面,我該如何終止本無限的投票,如果某些條件得到滿足,比如說,data.length> 1000,然後我想終止循環和調用另一個函數?我應該這樣做:

function getData() { 
     var tID = setTimeout(function() { 
     $.ajax({ 
      url : 'http://example.com', 
      type: 'GET', 
      success : function(data) { 
       //process data here 
       if(data.length > 1000) { 
        funcOutside(); 
        clearTimeout(tID); 
       } 
      }, 
      dataType : 'json' 
     }) }, 3000); 
    } 

回答

7

第二個選項不會每3秒輪詢一次;它只會輪詢一次。

有條件地繼續或停止投票,你應該使用第一個選項的變化:增加一個有條件圍繞setTimeout電話。

function getData() { 
    $.ajax({ 
     url : 'http://example.com', 
     type: 'GET', 
     success : function(data) { 
      // depending on the data, either call setTimeout or simply don't 
      if(/* data says continue polling */) { 
       setTimeout(getData, 3000); 
      } 
     }, 
     dataType : 'json' 
    }); 
} 
+0

感謝喬恩。我想你是對的。第二個版本只投票一次。我將使用你的方法在輪詢上做有條件的停止。 – tonga

2

那麼,有沒有這兩種方法有什麼區別?它們每三秒鐘有連續輪詢服務器的效果嗎?

是的,有一個重要的區別!第一個版本將在響應到達後將呼叫排隊到功能。所以通話間隔時間(大致)爲3000ms加上請求/響應時間。

第二個版本將使在3秒後的請求,則停止。如果您將setTimeout更改爲setInterval,則它會每3​​秒發出一個新請求,但不能保證在創建新請求時(如果某個請求需要〜3000ms),上一個請求已經完成。所以第一個版本可能是你要找的。

關於終止循環:是的,只需添加一個條件就像你在你的代碼有一個。但是,而不是清除超時,只是不添加一個新問題:

//process data here 
if(data.length > 1000) { 
    funcOutside(); 
} else { 
    setTimeout(getData, 3000); 
} 

最後一點:從技術上講,這不是遞歸,因爲它不是getData調用本身,而是來自setTimeout回調調用getData所有的時間。

+0

感謝您的建議。第二個版本的確只是調查一次數據。我應該像你指出的那樣用條件語句來使用第一個。 – tonga

0
(function loopsiloop(){ 
    setTimeout(function(){ 
    $.ajax({ 
     url: 'foo.htm', 
     success: function(response){ 
      // do something with the response 

      loopsiloop(); // recurse 
     }, 
     error: function(){ 
      // do some error handling. you 
      // should probably adjust the timeout 
      // here. 

      loopsiloop(); // recurse, if you'd like. 
     } 
    }); 
    }, 5000); 
})(); 

這會爲你做的工作。 我在這裏做的三件事情:

  1. 聲明函數loopsiloop被立即調用(注意末尾的括號)。
  2. 聲明超時處理程序在5秒後觸發。
  3. 在超時時間內輪詢服務器,一旦成功/失敗就會調用loopsiloop並繼續輪詢。