node.js async.each回调,如何知道它何时完成?

恩沃克

我试图把我的头围绕Node.js和一些异步操作。在以下代码中,我获取了一些RSS feed并存储了以前没有存储过的文章。该代码可以工作并存储新文章。但是,我不确定如何更改此设置,以便知道何时解析完所有文章。例如,async.eachLimit每次达到限制时都会调用每个回调(在10篇文章或5个feed之后)。那么我怎么知道什么时候完成呢?

var FeedParser = require('feedparser');
var request = require('request');
var mysql = require('mysql');
var async = require('async');

var connection = mysql.createConnection({
        host :  'localhost',
        user : 'someuser',
        password : 'somepass',
        database : 'somedb'
});

connection.connect();

connection.query('SELECT * FROM rssfeed', function(err, rows, fields) {
        if(err == null){
                async.eachLimit(rows, 5, parseFeed, function(err) {
                        if(! err) {
                                //horray
                        } else {
                                console.log(err);
                        }
                });
        }
});

function parseFeed(feed, callback) {
        var articles = [];
        request(feed.link)
        .pipe(new FeedParser())
        .on('error', function(error) {
                callback(error);
        })
        .on('meta', function(meta) {
        })
        .on('readable', function() {
                var stream = this, item;
                item = stream.read();
                if(item != null) {
                        item.rssfeed_id = feed.id;
                        articles.push(item);
                }
        })
        .on('finish', function() {
                async.eachLimit(articles, 10, parseArticle, function(err) {
                        if(! err) {
                                console.log('article each callback');
                        } else {
                                callback(error);
                        }
                });
        });
        callback();
}
function parseArticle(item, callback) {
        if(item.hasOwnProperty('rssfeed_id') && item.hasOwnProperty('guid') && item.hasOwnProperty('link') && item.hasOwnProperty('title')){
                connection.query('SELECT * FROM rssarticle WHERE rssfeed_id = ? AND guid = ?', [item.rssfeed_id, item.guid], function(err, rows, fields) {
                        if(rows.length == 0){
                                connection.query('INSERT INTO rssarticle SET ?', {
                                        rssfeed_id: item.rssfeed_id,
                                        link: item.link,
                                        title: item.title,
                                        description: item.description,
                                        publish_date: item.pubDate,
                                        guid: item.guid
                                }, function(err, result){
                                        if(err != null){
                                                console.log(err);
                                        }
                                });
                        }
                });
        }
        callback();
}
喝水

一方面,您太早地调用回调了。

function parseFeed(feed, callback) {
  request
    .streamStuff()
    .streamStuff()
    .streamStuff();

  callback();
}

callback完成之前,您不应该打电话否则,将调用您的“完成”方法,但您的异步代码实际上仍在运行。

因此,与其做:

.on('finish', function() {
    async.eachLimit(articles, 10, parseArticle, function(err) {
        if(! err) {
            console.log('article each callback');
        } else {
            callback(error);
        }
    });
});
callback();

做就是了

.on('finish', function() {
    async.eachLimit(articles, 10, parseArticle, function(err) {
        if(! err) {
            // assuming this is a stub and really ends up doing `callback();`
            console.log('article each callback');
        } else {
            callback(error);
        }
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在所有迭代完成之前调用了node.js async.each()回调

来自分类Dev

如何使用 async.js 简化 Node.js 中的回调代码

来自分类Dev

等到回调完成Node.js

来自分类Dev

Node.JS中的ASYNC

来自分类Dev

async.each是非阻塞的吗?node.js

来自分类Dev

在node.js中为async.series定义回调的位置

来自分类Dev

如何在async.waterfall Node.js中循环

来自分类Dev

node.js如何知道何时退出?

来自分类Dev

Node.js 如何知道所有异步功能何时完成?

来自分类Dev

如何返回Node.js回调

来自分类Dev

如何在node.js的async.each内进行同步http调用

来自分类Dev

了解Node.JS async.parallel

来自分类Dev

Node.js中的async / await替换

来自分类Dev

node.js中的async.eachSeries

来自分类Dev

.net中的Node.js与Async / await

来自分类Dev

node.js嵌套async.eachSeries

来自分类Dev

Node.js:async.map变慢

来自分类Dev

Node JS Async Promise。所有问题

来自分类Dev

Node.js中的async / await替换

来自分类Dev

使用 Node js Await/Async 函数

来自分类Dev

与Node js async / await相比,了解Python async / await

来自分类Dev

node.js 如何在异步操作之外保存变量以访问它的回调?

来自分类Dev

async.map不会在Node.js中调用回调

来自分类Dev

Node.JS async.parallel不会等待所有任务完成

来自分类Dev

node.js async.eachSeries调用最终回调为时过早

来自分类Dev

使用Node.js,Async,Waterfall,Each和MySQL同步控制流

来自分类Dev

Node.js async.each等待第一个循环

来自分类Dev

Node.js async.each等待第一个循环

来自分类Dev

node.js async.js nextTick与setImmediate