node.js async.eachcallback,我怎么知道什么时候完成?

我正在试图围绕Node.js和一些asynchronous操作。 在下面的代码中,我获取一些RSS提要,并存储发现的文章,如果我以前没有存储它们。 代码工作并存储新的文章。 但是,我不知道如何改变这个,所以我知道什么时候所有的文章被parsing。 例如,每次async.eachLimit的callback都会在每次async.eachLimit限制时被调用(10条或5条)。 那么我怎么知道他们什么时候完成?

 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(); } 

首先,你预先呼吁你的callback方式太早。

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

在完成之前,您不应该调用callback 。 否则,你的“完成”方法将被调用,但你的asynchronous代码将仍然在运行。

所以不要这样做:

 .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); } }); });