我正在使用Node.js请求库和node-feedparser捕获一个feed,并使用Mongoose将其发布到MongoDB数据库中.
我将帖子信息存储到posts集合中,并将feed信息存储到feed集合中,但是我需要将post._id存储在feeds集合中名为feeds._post的feed集合中.
我遇到的问题是使用流接口,在所有feedparser.on(‘可读’)对数据库的异步调用完成之前调用feedparser.on(‘end’),因此我最终得到了在Post集合中说15个帖子,在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();
});