0

angular.js アプリケーションのコントローラー関数の 1 つで、Google の RSS フィード 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];
                }
            }
        });
    }
});

}

4

1 に答える 1

0

アイテムのループが終了した後、コールバック関数は非同期で実行されます。ループの最後では、配列iに 2 つの項目があるため、2 に等しくなります。items

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 に答える