我在管理具有多个承诺的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
答案 0 :(得分:2)
您需要传递一组承诺,即使您使用的是延迟模式,也无法解决任何问题。假设getLatest
返回一个你可以做的承诺: -
refreshFeed: function(){
return $q.all(userdata.map(this.getLatest));
}
<强> Array.map 强>