对于循环和承诺

时间:2014-10-18 23:05:38

标签: angularjs angularjs-service

我在管理具有多个承诺的for循环时遇到了一些麻烦。我已经读过我应该使用$ q.all,但到目前为止我还没有取得任何成功。我需要这个函数来确保for循环中的所有异步调用都已发生。

refreshFeed: function(){    
    var defer = $q.defer();
    var promises = []; // array of promises

    for (var x = 0; x < userdata.length; x++){
        this.getLatest(x).then(function(){
            promises.push(x);
        });    
    }
    console.log(userdata); // this is updated successfully by getLatest(x)

    $q.all(promises).then(function(){ 
        defer.resolve();
    })

    return defer; 
}

它成功打印了console.log但是我在最初调用refreshFeed()的行中得到了控制台错误“undefined is not a function”。

任何帮助将不胜感激。谢谢!

编辑:

getLatest: function(x){ 
            var deferred = $q.defer();
            var promise = twitterService.getLatestTweets(userdata[x].searchterm, userdata[x].sources).then(function(data) {
                userdata[x].tweets = data;
                console.log(userdata[x].tweets);
                deferred.resolve();
            });
            return deferred.promise;
    }

更新:我使用了PSL的答案并玩弄了getLatest,我终于开始工作了。我只需要用function参数替换userdata [x]。谢谢@PSL

1 个答案:

答案 0 :(得分:2)

您需要传递一组承诺,即使您使用的是延迟模式,也无法解决任何问题。假设getLatest返回一个你可以做的承诺: -

refreshFeed: function(){    
    return $q.all(userdata.map(this.getLatest));
}

<强> Array.map