Node.js Streams on(end)完成之前完成asynchronous(可读)

我使用Node.js请求库和node-feedparser来捕获feed,并使用Mongoose将其发布到MongoDB数据库中。

我将发布信息存储到posts集合中,并将feed信息存储到feeds集合中,但是我需要将post._id存储在feeds集合中的一个数组中,名为feeds._post。

我遇到的问题是使用stream接口,feedparser.on('end')在所有feedparser.on('可读')对数据库的asynchronous调用完成之前调用,因此我最终在Post集合中说15个post,在Feed._post数组中只有11个post._id。

我明白,如果这只是普通的JavaScript,我可以使用async来确保.on('end')等待所有.on('可读')的完成,但是我怎样才能解决这个问题呢? ?

提前致谢。

db.Feed.findById(feedid, function(error, feed) { // request.on('response') -> this.pipe(feedparser) feedparser.on('readable', function() { var post; while (null !== (post = this.read())) { db.Post.create({ /* post details */ }, function(err, post) { feed._post.push(post); }); } }); feedparser.on('end', function() { feed.save(); }); }); 

你需要跟踪一个计数器和一个布尔值。 当“可读”事件第一次触发时递增计数器,并在完成将计数器保存到数据库时递减计数器。 布尔值从一个状态开始,在“结束”事件触发时切换。 例如:

  var processing = 0, done = false; var finished = function(){ if(processing === 0 && done){ feed.save(); // ... other stuff } }; feedparser.on("readable", function(){ processing++; doStuff(something, function(){ // something asynchronous processing--; finished(); }); }); feedparser.on("end", function(){ done = true; finished(); });