2011-11-25 30 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