对于循环和承诺

问题描述:

我在管理多个承诺的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)); 
} 

Array.map

+0

嘿感谢您的答复。我仍然收到错误,但我猜它与getLatest()有关。我已refreshofed()设置为您的答案。我收到错误“无法读取未定义的属性'searchterm'”。我将使用getLatest()代码 – DaveS 2014-10-18 23:29:25

+1

更新问题得到它的工作。谢谢! – DaveS 2014-10-18 23:44:58