Node.js 异步模块在迭代完成之前完成
Node.js async module gets finished before the iteration completes
我有大约 100 个 Rss 链接需要每 3 分钟获取一次。
所以我正在使用异步模块来完成它。但在处理所有 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 提要链接并将其每 3 分钟无重复地存储在 MySQL 数据库中的正确程序吗。
你想要的是async.each
而不是async.forEach
。
forEach 指的是内置 javascript 函数,每个都是异步的一部分。
您的一个 Feed 似乎没有被正确解析,因此 returns 出现错误。
这是 async.each 的完全正常行为,事实上你应该注意到如果迭代器将错误传递给它的回调,主回调(对于每个函数)会立即调用错误,所以如果其中一个函数returns 其他回调无法完成执行的错误。
如果您希望所有数组元素都得到处理,您总是可以将 null 传递给您的回调,并找到另一种方法来处理错误。
我有大约 100 个 Rss 链接需要每 3 分钟获取一次。
所以我正在使用异步模块来完成它。但在处理所有 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 提要链接并将其每 3 分钟无重复地存储在 MySQL 数据库中的正确程序吗。
你想要的是async.each
而不是async.forEach
。
forEach 指的是内置 javascript 函数,每个都是异步的一部分。
您的一个 Feed 似乎没有被正确解析,因此 returns 出现错误。 这是 async.each 的完全正常行为,事实上你应该注意到如果迭代器将错误传递给它的回调,主回调(对于每个函数)会立即调用错误,所以如果其中一个函数returns 其他回调无法完成执行的错误。 如果您希望所有数组元素都得到处理,您总是可以将 null 传递给您的回调,并找到另一种方法来处理错误。