0

在我的 angular.js 应用程序中的一个控制器函数中,我正在尝试使用 Google 的 RSS Feed API 来获取 feed 条目以填充到我的 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];
                }
            }
        });
    }
});

}

4

1 回答 1

0

在项目的循环结束后,回调函数异步执行。并且在循环结束时,i等于 2,因为您的items数组中有 2 个项目。

看到Javascript 臭名昭著的循环问题?有关相同行为的另一个示例,以及https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake以获得更深入的解释。

于 2013-07-21T16:47:19.357 回答