我正在尝试构建一个简单的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
答案 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
});
}
}
这意味着,将数组元素传递给异步任务,然后它返回到响应中,然后用它来查找数组索引并更新元素