1

msdn Web サイトからいくつかの Windows 8 チュートリアルに取り組んでいます。具体的には、私はこれに取り組んでいます。

私のコードの一部(チュートリアルからコピーされたものは、なぜそれがエラーになるのか、私の心を吹き飛ばしています。以下のサンプル:

(function () {
    "use strict";

    var list = getBlogPosts();
    var groupedItems = list.createGrouped(
        function groupKeySelector(item) { return item.group.key; },
        function groupDataSelector(item) { return item.group; }
    );
    var dataPromises = [];
    var blogs;
    var blogPosts = new WinJS.Binding.List();

    function getFeeds() {
        blogs = [
            {
                key: "blog1",
                url: 'http://windowsteamblog.com/windows/b/developers/atom.aspx',
                title: 'tbd', updated: 'tbd',
                acquireSyndication: acquireSyndication, dataPromise: null
            },
            // lots more entries ...
        ];

        blogs.forEach(function (feed) {
            feed.dataPromise = feed.acquireSyndication(feed.url);
            dataPromises.push(feed.dataPromise);
        });

        return WinJS.Promise.join(dataPromises).then(function () { return blogs });
    }

// more code...

})();

dataPromises.push(feed.dataPromise);でエラーが発生しますJavaScript runtime error: Unable to get property 'push' of undefined or null referencedataPromisesファイルの先頭近くで定義され、空の配列に初期化されていることがわかります(また、で初期化しようとしましたnew Array();)。

ここで何が間違っているのですか?私は愚かな失敗をしたと思います... ちなみに、dataPromises上記のスニペットに表示されている 3 つの場所は、プロジェクト内のどこにでも表示される唯一の場所です。

私の最初の考えは巻き上げでしたが、何か魔法のようなことが起こっていない限りdataPromises、最上位の関数スコープをオーバーライドしている可能性のあるローカルスコープで明示的に宣言していません。

4

1 に答える 1

3

チュートリアルを正しく実行していません。この線

var list = getBlogPosts();

new WinJS.Binding.List()初期化する行の後に発生する呼び出しを置き換えますdataPromises

問題は、getBlogPosts()が を呼び出してgetFeeds()おり、getFeeds結果を にプッシュしようとしていますdataPromisesが、行var dataPromises = []がまだ実行されていないため、dataPromisesまだundefinedです。

への呼び出しを変数getBlogPosts()の初期化後に移動します。dataPromises

デバッガーでコードを 1 行ずつステップ実行すると、この問題がかなり簡単に明らかになるはずです。

于 2012-08-15T21:29:19.377 に答える