如何等待Array填充(异步)

时间:2011-11-25 10:40:49

标签: javascript jquery

我有一个异步填充的数组,包含28个项目。我想等到阵列充满所有项目。

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

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

好吧,但是在Javascript中没有等待功能!我尝试使用setTimeout,但我不知道如何插入它...我只是因为太多的递归和东西而得到错误:D

谢谢!

2 个答案:

答案 0 :(得分:11)

尝试:

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

这将每隔100毫秒调用一次检查函数,直到checkIfFinished()给你回真。

答案 1 :(得分: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计时器和计划也应该可以正常工作,但它们可能很笨拙,并且可能会在实际完成逻辑触发之前产生一些等待时间。