2012-09-27 89 views
-1

我有一個函數數組來迭代setTimeout函數以提供非阻塞效果,但是任何或所有函數都可以有順序標誌,這意味着只有在執行了前一個函數之後才能執行該功能。有人建議我使用jquery.deferred。我從來沒有使用jQuery推遲。jquery deferred setTimeout loop

while(that.funcns.length>0){ 
    fn=that.funcns.splice(0,1)[0]; 
    fn.idx=i; 
    window.setTimeout(function(){ 
    fn.ref(); //call function reference  
    },(idx==0)?idx:1000); 
} 
//fn - {ref:functionReference,order:true/false}; 
+0

谷歌'jquery推遲' – BNL

+0

我已經做到了,但找不到適合我的情況。 –

+0

什麼是'i','idx'和'ref'?告訴我們關於那些「funcn」物品 – Bergi

回答

0

您可以使用延遲對象,但爲什麼不使用一個計時器並逐個調用函數呢?

var funcs = [/* array of functions */]; 

function next() { 
    var func = funcs.shift(); 
    if(func) { 
     func(); 
     setTimeout(next, 100); 
    } 
} 

next(); 

事情變得如果有些功能可以「並行」運行,一些依賴更復雜,但您沒有提供很多這方面的信息。

但它也沒有太大的區別。如果您不使用網絡工作者,即使您使用setTimeout,也會按順序運行任何JavaScript。只是執行的順序沒有確定。

+0

是的我知道,但我從我的客戶之一,顯然是技術要求,誰想要得到它像其他語言線程實施.. –

+0

請看我的補充。它並不重要,因爲JavaScript總是單線程的。你不能同時運行兩個功能(除非你使用webworkers,這是一個完全不同的故事)。 –

+0

@Felix Kling,如果函數包含XHttpRequest或其他瀏覽器異步調用,該怎麼辦? –

0

如果我理解了你的問題,你放入列表中的每個函數都可以有一個標誌,表示「等待執行我,直到執行完所有先前的函數」。因此,您需要做的是將函數計數和代碼添加到您執行的每個函數中以減少計數。像這樣的東西,我把副本的jsfiddle here

var funcCount = 0, funcList = []; 

function executeFunctions() { 
    var nextFunc; 

    while (funcList.length > 0) { 
     // Check next in list, if we need to wait, make sure we wait 
     nextFunc = funcList[0]; 
     if (nextFunc.needToWait) { 
      if (funcCount > 0) { 
       // Try again later 
       setTimeout(executeFunctions, 100); 
       return; 
      } 
     } 

     // Since we are now going to execute, remove from list and execute 
     funcList.splice(0, 1); 
     funcCount += 1; // nextFunc will subtract 1 on completion 
     setTimeout(nextFunc, 100); 
    } 
} 

// For async functions to call back to completion 
function completionCallback() { 
    funcCount -= 1; 
} 

爲了測試它,我已經定義了兩種功能。第一個模擬了超長超時的異步。第二個設置了等待標誌,所以需要等待第一個。然後我他們兩個添加到列表中,並對其進行測試:

// Example function 1 is simulated async 
function example1() { 
    alert("Example1"); 

    // Simulate async call with completion callback function, e.g. XHttpRequest 
    setTimeout(completionCallback, 2000); 
}  
example1.needToWait = false;  // Not flagged 

// Example function is flagged as need others to complete first 
function example2() { 
    alert("Example2"); 

    funcCount -= 1;   
} 
example2.needToWait = true; 

// Setup function list to execute example1 then example2 
funcList.push(example1); 
funcList.push(example2); 

// OK, test it 
executeFunctions(); 

如果你改變了函數2標誌設置爲false,警示框顯示了一前一後,馬上。如果將其保留爲true,則第二個不會顯示,直到2秒鐘過去。