gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:14:21 26 4
gpt4 key购买 nike

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

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

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

我知道如果这只是普通的 JavaScript,我可以使用异步来确保 .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();
});

});

最佳答案

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

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

关于Node.js Streams on(end) 在异步 on(readable) 完成之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com