对于循环和承诺
问题描述:
我在管理多个承诺的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,但然后我得到控制台错误“undefined不是一个函数”在最初调用refreshFeed()的行。
任何帮助,将不胜感激。谢谢!
编辑:
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玩弄周围,我终于得到它的工作。我只需要用函数参数替换userdata [x]。谢谢@PSL
答
您将需要传递一个承诺数组,即使您使用延迟模式,您不解决任何问题。假设getLatest
的回报,你可以只是做一个承诺: -
refreshFeed: function(){
return $q.all(userdata.map(this.getLatest));
}
嘿感谢您的答复。我仍然收到错误,但我猜它与getLatest()有关。我已refreshofed()设置为您的答案。我收到错误“无法读取未定义的属性'searchterm'”。我将使用getLatest()代码 – DaveS 2014-10-18 23:29:25
更新问题得到它的工作。谢谢! – DaveS 2014-10-18 23:44:58