繁体   English   中英

Node.js异步模块在迭代完成之前完成

[英]Node.js async module gets finished before the iteration completes

我大约需要每3分钟提取100个Rss链接。

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

feedRecords是一个包含RSS网址和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 db中而不重复。

似乎您的Feed中有一个未正确解析,因此会返回错误。 对于async.each来说,这是完全正常的行为,实际上,您应该注意到,如果迭代器将错误传递给其回调,则主回调(针对每个函数)会立即被错误调用,因此,如果其中一个函数返回一个错误,其他回调将无法完成执行。 如果您仍然希望处理所有数组元素,则可以始终将null传递给回调,并找到另一种方法来处理错误。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM