2014-10-18 147 views
2

我在管理多個承諾的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

回答

2

您將需要傳遞一個承諾數組,即使您使用延遲模式,您不解決任何問題。假設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