2011-11-25 82 views
3

我有一個數組,它是異步填充的並且包含28個項目。我想等到數組填滿所有項目。如何等待,直到陣列填充(異步)

function checkIfFinished(){ 
    return(Results.length >= 28); 
} 

var isfinished = false; 
while(isfinished){ 
    if(checkIfFinished()){ 
     returnResults(); 
     isfinished = true; 
    } 
    else 
     //Wait 100ms 
} 

那麼,但在Javascript中沒有等待功能!我嘗試了setTimeout,但我不知道如何插入它...我只是得到了太多的遞歸和東西的錯誤:D

謝謝!

+3

你自己填充陣列嗎?如果是這樣,可能需要使用自定義事件來完成填充時觸發/收聽。 – pimvdb

+0

有一個簡單的規則。一個不會編寫同步(阻止)JavaScript。 – Tomalak

回答

8

嘗試:

var timeout = setInterval(function() 
{ if(checkIfFinished()) { clearInterval(timeout); isFinished = true; } }, 100); 

這將調用您的檢查功能,每100毫秒直至checkIfFinished()提供真正還給你。

+2

我想你的意思要麼'setInterval'或在回調中設置另一個超時。 – pimvdb

+0

是的,現在修好了,謝謝! – lfxgroove

+1

我想你的意思是'clearInterval',但那是解決方案!工作完美:)謝謝你! – Weedjo

3

如果您使用jQuery 1.5+,這聽起來像是在您的代碼中使用deferred objects and promises的絕佳機會。我假設你使用AJAX調用來填充你的數組。

概括地說,這樣的事情應該爲你工作:

$(function() { 

    var $ajaxcalls = [], 
     myArray = []; 

    // set up all the ajax calls that will populate my array 
    for(var i=0; i < 28; i++) { 
     $ajaxcalls[i] = $.ajax({ 
      url : 'http://your.domain.com/blah', 
      data : i 
     }).success(function(m) { 
      myArray.push(m); 
     }); 
    } 

    // this will setup the promise --- 
    // what will run when all 28 AJAX calls complete? 
    $.when.apply(null, $ajaxcalls).then(function() { 
     returnResults(); 
    }); 

}); 

我已經written about this some time back爲好。我真的認爲這是一個漂亮的功能/概念,如果使用正確,它可能非常強大。 Javascript定時器和時間表也應該可以工作,但它們可能很笨重,並且可能導致實際完成邏輯觸發之前的等待時間。

+0

不知道這個存在,感謝您的展示! – lfxgroove