0

我正在尝试遍历一系列 RSS 提要,如下所示:

        var rssFeeds = [ ['http://www.huffingtonpost.com/tag/womens-rights/feed/', "Huffington Post"], ['http://abcnews.go.com/topics/urss?pageid=681900', "ABC News"], ['http://www.globalissues.org/news/topic/166/feed', "Global Issues"], ['http://topics.nytimes.com/top/reference/timestopics/subjects/f/feminist_movement/index.html?rss=1', "The New York Times"] ];            

该数组既包含提要的位置,也包含提要名称的字符串。我使用下面的 for 循环遍历数组,其中 i 作为迭代器。

收到结果后,我使用 for 循环 j 遍历回调函数中的结果。我将每个获取的结果附加到另一个数组 entryArray,并在附加每个结果之后,使用 RSS 提要的名称向该获取的结果添加一个新属性“源”。

        function loadEntries()
        {
            var feedr = new Array();

            for( var i = 0; i < rssFeeds.length; i++ )
            {
                feedr[i] = new google.feeds.Feed( rssFeeds[i][0] );
                feedr[i].setNumEntries(loadAmount);

                feedr[i].load(function(result) {
                    if (!result.error) {
                        console.log(i);
                        for (var j = 0; j < result.feed.entries.length; j++) {
                            entryArray[entryArray.length] = result.feed.entries[j];
                            entryArray[entryArray.length - 1]['source'] = rssFeeds[i][1];
                        }
                    }
                });
            }
        } 

但是,这就是问题出现的地方,我使用 (i) 来指示要追加的名称的迭代器始终等于 rssFeeds.length,因为所有四个加载命令的回调函数都发生在初始 for 循环已经完成迭代之后. console.log(i); 你看到总是返回 4。

这在我单独复制和粘贴每个项目的代码时有效,但我宁愿不复制和粘贴,因为 RSSFeeds 数组将来可能会更长。有什么办法可以通过循环来完成吗?

4

2 回答 2

0

所以首先,我要感谢 nd_macias 为我提供了帮助我找到此解决方案的链接。基本上,我将加载函数包装在一个函数中,然后使用 for 循环调用该函数,如下所示:

        function loadEntries()
        {
            var feedr = new Array();

            for( var i = 0; i < rssFeeds.length; i++ )
            {
                feedr[i] = new google.feeds.Feed( rssFeeds[i][0] );
                feedr[i].setNumEntries(loadAmount);

                var f = function(n) {
                    feedr[n].load(function(result) {
                        if (!result.error) {
                            for (var j = 0; j < result.feed.entries.length; j++) {
                                entryArray[entryArray.length] = result.feed.entries[j];
                                entryArray[entryArray.length - 1]['source'] = rssFeeds[n][1];
                            }
                        }
                    });
                }

                f(i);
            }
        } 
于 2014-10-23T01:13:59.317 回答
0

考虑以下JSFiddle 示例

您的代码无法按预期运行的原因是变量i, 的值将i = 4位于循环结束时,而不是所需的 0,1,2,3 ,因为这已经发生由 for 循环递增。

诀窍是使用一个recursive函数,你的load函数将类似于:

    feedr.load(function (result) {
        if (!result.error) {
            console.log(i);
            for (var j = 0; j < result.feed.entries.length; j++) {
                entryArray[entryArray.length] = result.feed.entries[j];
                entryArray[entryArray.length - 1]['source'] = rssFeeds[i][1];
            }
            if (rssFeeds.length - 1 > i) {
                loadEntries();
                i++;
            }
        }
     });
于 2014-10-22T22:22:37.997 回答