在我的angular.js应用程序中的一个控制器功能中,我正在尝试使用Google的RSS Feed API来获取要在我的scope.items模型中填充的供稿条目。
它表现得非常奇怪,最里面部分的控制台输出始终为'2',但最外层循环中的控制台输出为'0'和'1'(这是正确的,因为这是我的项目的长度数组)。
我认为它可能与Google API事件是异步请求有关,而且在我尝试操作之前它还没有完成(?)。尽管我的迭代器变量变为'2'仍然没有意义!
代码:
function ItemListCtrl($scope, Item) {
$scope.items = Item.query({}, function() { // using a JSON service
for (var i = 0; i < $scope.items.length; i++) { // the length is 2 here.
$scope.items[i].entries = [];
console.log(i); // gives '0' and '1' as output in the iterations.
var feed = new google.feeds.Feed($scope.items[i].feedUrl);
feed.load(function(result) {
console.log(i); // gives '2' as output in both the iterations.
if (!result.error) {
for (var j = 0; j < result.feed.entries.length; j++) {
$scope.items[i].entries[j] = result.feed.entries[j];
}
}
});
}
});
}
答案 0 :(得分:0)
在项目循环结束后,异步执行回调函数。在循环结束时,i
等于2,因为items
数组中有2个项目。
有关相同行为的其他示例,请参阅Javascript infamous Loop issue?,有关更深入的说明,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake。