我正在通过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

最佳答案

您没有正确遵循本教程。线

var list = getBlogPosts();


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

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

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

在调试器中逐行逐步执行代码应该以一种非常直接的方式解决了这个问题。

09-25 15:54