Node.js Streams on(end)在异步打开(可读)之前完成

时间:2014-06-20 18:14:27

标签: node.js mongodb asynchronous stream mongoose

我使用Node.js请求库和node-feedparser使用Mongoose将Feed及其帖子捕获到MongoDB数据库中。

我将帖子信息存储到帖子集合中,并将Feed信息存储到Feed集合中,但我需要将post._id存储在Feed集合中名为feeds._post的数组中。

我遇到的问题是使用流界面,在所有feedparser.on('可读')之前调用feedparser.on(' end')对数据库的异步调用已经完成,因此我最终在Post集合中说了15个帖子,在Feed._post数组中只有11个post._id。

我知道如果这只是普通的JavaScript,我可以使用异步来确保.on(' end')等待所有.on('可读')& #39;要完成,但我如何用流来解决这个问题呢?

提前致谢。

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

});

1 个答案:

答案 0 :(得分:2)

您需要跟踪计数器和布尔值。当"可读"增加计数器当您将计数器保存到数据库时,事件首先触发并递减计数器。布尔值在一个状态下开始,并在" end"事件火灾。例如:

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