2014-06-20 31 views
2

我使用Node.js的请求库节点feedparser沿着以捕获进料和它的文章到使用猫鼬MongoDB数据库。Node.js的流完成

我存储的信息后进入岗位收集和成饲料收集馈送信息,但我需要存储在饲料集合称为feeds._post阵列内的post._id。

我遇到的问题是使用流接口,feedparser.on('end')在所有feedparser.on('可读')对数据库的异步调用完成之前调用,因此我最终说,收集后在15个职位,只有11 post._id年代Feed._post阵列英寸我知道如果这只是普通的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(); 
    }); 

}); 

回答

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

我刚完成一个相同的解决方案,除了代替'函数结束()'我实现'feedparser.on(“saveComplete”)',然后内的'feedparser.on('可读')'我'如果(--postsSaving === 0 && parserEnded)feedparser.emit(' saveComplete')'。非常类似的解决方案,感谢您花时间回复。 – David

+0

@大卫,使用“saveComplete”事件似乎好得多的解决方案给我 - 即使使用此需要注意使用不同的事件名称,以标明完成代码。耻辱我们无法控制被解雇的'已完成'事件。 – RichS