无法循环API响应/访问循环变量

时间:2014-09-15 18:43:14

标签: javascript angularjs twitter

我正在尝试构建一个简单的Twitter Feed应用程序,但我在实现刷新功能时遇到了困难。

    $scope.refreshTimeline = function() {
  for (x = 0; x < $scope.tweetsarray.length; x++){ // loop through the twitter feeds
    twitterService.getLatestTweets($scope.tweetsarray[x].name).then(function(data) {
      $scope.tweetsarray[x].tweets = data; //update each
    });
  }
}

和getlatesttweets函数

getLatestTweets: function (name) {
        //create a deferred object using Angular's $q service
        var deferred = $q.defer();

        var promise = authorizationResult.get('https://api.twitter.com/1.1/search/tweets.json?q='+name+'&count=8').done(function(data) {
            //when the data is retrieved resolved the deferred object
            deferred.resolve(data)
        });
        //return the promise of the deferred object
        return deferred.promise;
    }

所以这就是我遇到的问题

1).then(函数(数据)中的x(全局变量,在其他地方未使用)的值似乎与循环中的任何其他位置不同,并且似乎没有增加。我尝试过使用$ scope.x或使它成为循环中的函数变量。如果我将其硬编码为仅在tweetsarray中刷新[0],则刷新有效,但[x]返回一个单独的值。

2)我猜测在尝试使用延迟承诺循环一个函数时存在某种问题。有没有办法可以确保每次通过循环时都会在继续之前返回承诺?

谢谢,感谢您的帮助!

-Dave

2 个答案:

答案 0 :(得分:0)

由于javascript的关闭行为,它将在服务回调时采用最新的x值。所以试试这个。

 $scope.refreshTimeline = function() {
  for (var x = 0; x < $scope.tweetsarray.length; x++){ 
    storeTweets(x);       
  }
 }

 function storeTweets(x){
    twitterService.getLatestTweets($scope.tweetsarray[x].name).then(function(data) {
      $scope.tweetsarray[x].tweets = data; //update each
    });
 }

答案 1 :(得分:0)

你可以做这样的事情

 $scope.refreshTimeline = function() {
   for (x = 0; x < $scope.tweetsarray.length; x++){ // loop through the twitter feeds
      var data;
      data.tweet = $scope.tweetsarray[x];
      twitterService.getLatestTweets($scope.tweetsarray[x].name).then(function(data) {
      $scope.tweetsarray[$scope.tweetsarray.indexof(data.tweet)].tweets = data; //update each
    });
   }
 }

这意味着,将数组元素传递给异步任务,然后它返回到响应中,然后用它来查找数组索引并更新元素