我试图迭代一系列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数组将来可能会更长。有什么方法可以通过循环实现这一点吗?
答案 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);
}
}