Javascript使用for循环加载RSS提要

时间:2014-10-22 19:59:20

标签: javascript arrays asynchronous rss google-feed-api

我试图迭代一系列RSS Feed,如下所示:

        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"] ];            

此数组包含Feed的位置和包含Feed名称的字符串。我使用for循环遍历数组,如下所示,i作为迭代器。

收到结果后,我使用for循环j在回调函数中迭代结果。我将每个获取的结果附加到另一个数组entryArray,并在追加每个结果后,添加一个新属性' source'使用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数组将来可能会更长。有什么方法可以通过循环实现这一点吗?

2 个答案:

答案 0 :(得分:0)

考虑以下JSFiddle example

您的代码无法按预期运行的原因是因为变量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++;
            }
        }
     });

答案 1 :(得分:0)

首先,我要感谢nd_macias为我提供了帮助我找到此解决方案的链接。基本上,我将load函数包装在一个函数中,然后使用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);
            }
        }