Node.js流on(end)在异步on(readable)完成之前完成



我正在使用Node.js请求库以及node-feedparser来捕获提要,并且它的帖子使用Mongoose进入MongoDB数据库。

我将帖子信息存储到posts集合中,将提要信息存储到提要集合中,但是我需要存储帖子。

提要集合中名为feeds._post的数组中的_id。

我遇到的问题是使用流接口,feedparser.on('end')在所有feedparser.on('readable')对DB的异步调用完成之前被调用,因此我最终在Post集合中有15个帖子,只有11个帖子。_id在Feed中。_post数组。

我明白,如果这只是普通的JavaScript,我可以使用async来确保。on('end')等待所有的。on('readable')的完成,但我怎么去这个与流?

提前感谢。

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

您需要跟踪计数器和布尔值。在"readable"事件首次触发时增加计数器,并在完成将其保存到数据库时减少计数器。布尔值以一种状态开始,并在"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();
 });

相关内容

  • 没有找到相关文章