Windows 8 Javascript疯狂 - 变量undefined

时间:2012-08-15 20:52:23

标签: javascript windows-8

我正在使用msdn网站上的一些Windows 8教程。具体来说,我在this one

我的部分代码(从教程中复制了我的想法,为什么它会出错。下面的示例:

(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 reference。您可以看到dataPromises已定义并初始化为文件顶部附近的空数组(我还尝试使用new Array();初始化它。)

我在这里做错了什么???我猜我做了一些愚蠢的搞砸......顺便说一下,上面代码片段中出现的3个地方dataPromises是它出现在项目中任何地方的唯一位置。

我的第一个想法是悬挂,但除非发生了一些神奇的事情,否则我没有在任何可能覆盖顶级功能范围的本地范围内明确声明dataPromises

1 个答案:

答案 0 :(得分:3)

您没有正确遵循教程。这条线

var list = getBlogPosts();

替换new WinJS.Binding.List()调用,该调用发生在初始化dataPromises的行之后。

问题是getBlogPosts()正在调用getFeeds(),而getFeeds正在尝试将结果推送到dataPromises,但行var dataPromises = []尚未执行,因此dataPromises仍为undefined

getBlogPosts()变量初始化后将调用移至dataPromises

逐行逐步调试调试器中的代码应该会以相当简单的方式暴露这个问题。