2014-09-15 6 views
0

Я пытаюсь создать простое приложение для твитов, но мне сложно выполнить функцию обновления.Невозможно перебрать переменные цикла ответа API/доступа

$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 (функция (данные), по-видимому, отличается от любого другого в цикле, и она, похоже, не увеличивается. Я попытался использовать $ scope.x или сделать его переменной функции в цикле. Обновление работает, если я жестко привязываю его к только обновить [0] в tweetsarray, но [x] возвращает отдельное значение.

2) Я предполагаю, что есть какая-то проблема с попыткой выполнить функцию с отсроченными обещаниями. Есть ли способ, которым я могу убедиться в каждом прохождении цикла, что обещание возвращается, прежде чем продолжить?

Спасибо, что я ценю вашу помощь!

-Dave

+0

цикл работает синхронно, и ваш вызов ajax внутри цикла асинхронный ..., просто выполните .. 'function setTweets (x) {// youcode ...}' и вызовите 'for (x = 0; x < $ scope.tweetsarray.length; x ++) {setTweets (x); } 'с этим мы создаем локальную копию' x' для каждого вызова ajax и его обратного вызова в отличие от общей переменной 'x' в вашем случае (которая закончилась бы до вашего обратного вызова) ... – PSL

+0

это сработало ! благодаря! – DaveS

ответ

0

Из-за поведения закрывающего JavaScript, он будет считать последнюю х значение во время обратного вызова службы. Поэтому попробуйте таким образом.

$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 
    }); 
} 
+0

Спасибо! Теперь он отлично работает. – DaveS

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 
    }); 
    } 
} 

это значит, передать элемент массива задачи асинхронном и он возвращается в ответ, а затем использовать его, чтобы найти индекс массива и обновление Элемент

Смежные вопросы