2011-03-06 68 views
0

我有這個javascript函數,它使用計時器每2秒調用一次ajax文件。
但是,我發現在執行完以前的數據之前,會將此數據發送到ajax文件。也就是說,它在大約10秒內發送整個列表,而數據大約需要120秒才能處理。將javascript定時器函數轉換爲使用異步調用

有沒有辦法,我可以發送下一個數據節點,只有當前一個完成處理? cb.call(this)正在用來調用一個函數,當這個定時器完成時,
querylimit是一個響應變量,如果它是真的退出函數。

var i = 0; 
var querylimit=false; 
function refreshTimer(list,cb,i){ 
    if (!(i >= 0)) { i= 0; } 
    setTimeout((function(chunk){ 
     i++; 
     return function(){ 
      if (querylimit) { cb.call(this); } 
      if(i <= list.length && !querylimit){ 
       refreshTimer(list,cb,i); 
       refreshClients(chunk); 
      } 
      if(i == list.length+1) { cb.call(this); } 
      if(i > list.length+1 || querylimit) { return null; } 
     } 
    }) (list[i]), 2000); 
} 

問候
尼基爾古普塔

+0

「(!(I> = 0)){IF」 - > ???? omg :)無論如何,不​​明白你想要完成什麼。你想鏈接函數調用?那麼,爲什麼你使用setTimeout?當第一個結束時,請致電下一個。 – 2011-03-06 10:21:47

+0

當'我'有其他值(我使用'我'很多,因此..)是一個錯誤的事情? :| – Stoic 2011-03-06 10:27:13

回答

2

我通常建立我所說的「層疊」,這是window.setTimeout(...)調用,而不是單個的連鎖反應window.setInterval(...)調用。

相反的:

function requestAjaxData() { 
    // prep ajax/call onAjaxDataReceived on success. 
} 
function onAjaxDataReceived() { 
    // process data 
} 
window.setInterval(requestAjaxData, 2000); 

我做的:

function requestAjaxData() { 
    // prep ajax/call onAjaxDataReceived on success. 
} 
function onAjaxDataReceived() { 
    // process data 

    // continue the cascade 
    requestAjaxDataCascade(); 
} 
function requestAjaxDataCascade() { 
    window.setTimeout(requestAjaxData, 2000); 
} 
requestAjaxDataCascade(); 
+0

你能否擴展這個例子來說明如何將數據注入到上面的函數中,也就是說我有一個json格式的數組數組,我怎麼才能讓'requestAjaxData'只發送一個子數組?我真的很感激這一點。我不知道這個特殊的事情,因此,我正在使用Timer來增加列表索引('i')。 – Stoic 2011-03-06 10:34:49

+0

解決了:)謝謝:) – Stoic 2011-03-06 11:10:52