【问题标题】:Node.js Streams on(end) completing before asynchronous on(readable) completedNode.js Streams on(end) 在异步 on(可读) 完成之前完成
【发布时间】:2014-08-11 13:38:29
【问题描述】:

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

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

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

我知道如果这只是简单的 JavaScript,我可以使用异步来确保 .on('end') 等待所有 .on('ready') 完成,但我该怎么做这与流有关?

提前致谢。

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

});

【问题讨论】:

    标签: node.js mongodb asynchronous stream mongoose


    【解决方案1】:

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

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

    【讨论】:

    • 我刚刚完成了一个相同的解决方案,除了我实现了feedparser.on('saveComplete') 而不是function finished(),然后在feedparser.on('readable') 中我有if ( --postsSaving === 0 && parserEnded ) feedparser.emit('saveComplete')。非常相似的解决方案,感谢您抽出宝贵时间回复。
    • @David,使用 'saveComplete' 事件对我来说似乎是更好的解决方案 - 即使使用此事件的代码需要注意使用不同的事件名称来指示完成。遗憾的是我们无法控制被触发的 'finished' 事件。
    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多