2015-10-01 56 views
2

我有大约100个需要每3分钟获取一次的Rss链接。Node.js异步模块在迭代完成前完成

所以我使用异步模块来做到这一点。但是,在处理所有Rss链接之前,它会完成并退出。 以下是守则。

feedRecords是一个数组,其中包含RSS url和一个id;

var items = []; 
var parseRss = require("parse-rss"); 
var async = require('async'); 

async.forEach(feedRecords, function taskIterator(feedItem, callback) 
{ 
    parseRss(feedItem.url, function (err, articles) 
    { 
     if (err) 
     { 
      callback(err); 
     } 
     else 
     { 
      console.log("Feed Id : " + feedItem.feed_id + ", Length : " + articles.length); 
      items.push({ data : articles, feed_id : feedItem.feed_id }); 
      callback(null); 
     } 
    }); 
}, 
function() 
{ 
    if (items.length > 0) 
    { 
     console.log("Total : " + items.length); 
    } 
    else 
     console.log("No data found"); 
}); 

我立刻得到找不到数据,然后我得到的日志结果。

下面是输出

No data found 

Feed Id : 12, Length : 3 

Feed Id : 14, Length : 1 

Feed Id : 13, Length : 1 

Feed Id : 17, Length : 8 

Feed Id : 4, Length : 11 

Feed Id : 5, Length : 7 

Feed Id : 6, Length : 8 

Feed Id : 16, Length : 24 

Feed Id : 11, Length : 11 

Feed Id : 3, Length : 18 

Feed Id : 1, Length : 183 

是否有人可以解决并确认这是正确的程序来解析约100 RSS订阅链接,并将其存储在MySQL每3分钟没有重复分贝。

回答

5

看起来你的饲料之一不到风度得到正确解析从而返回一个错误。 这是async.each的完全正常行为,事实上你应该注意到,如果迭代器将错误传递给它的回调函数,那么主回调函数(对于每个函数)会立即调用错误,所以如果其中一个函数返回其他回调错误将不会完成执行。 如果您想要处理所有数组元素,您总是可以将null传递给您的回调函数,并找到另一种方式来处理错误。

+0

谢谢bokor, 实际上err有价值**没有文章**所以这是造成问题。 我可以跑5到10平行,以便它更快地完成工作。 – Sharath

+0

如果要运行5到10个并行任务,则可以使用eachLimit,其中第二个参数是要执行的并行任务数。如果这解决了您的问题,请考虑接受答案,谢谢。 –

-2

你想要的是async.each而不是async.forEach。 forEach指的是内置的javascript函数,每个都是异步的一部分。

https://github.com/caolan/async#each

+2

'async.forEach'是'async.each'的别名。请参阅[源代码](https://github.com/caolan/async/blob/master/lib/async.js#L213)。 – JohnnyHK

+0

我尝试使用** each,eachLimit,map,mapLimit,mapseries **,但给我相同的输出只有在1或2处理后没有找到数据显示。 是否可以并行运行可能有一些限制为5或10,以便处理速度更快。 – Sharath

+0

这就是eachLimit通常所说的。将并发限制到预定义的数量。 –