2014-06-20 56 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