[英]How to handle the asynchronous transaction in Nodejs
我的應用程序基於Nodejs
+ Mongodb
+ amqp
。 核心模塊正在從amqp
接收消息,然后將其包裝到相應的消息事務中。 在消息事務中,將消息信息保存到mongodb
和其他一些邏輯中。
function messageReceiverCallback(msg) {
try {
messageHandler(decode(msg));
} catch (ex) {
}
}
function messageHandler(msg) {
function defaultTransaction() {
}
var dispatch = {
'default': defaultTransaction
}
dispatch[MSG.TYPE1] = Msg1Transaction;
// other message transaction here
return (dispatch[msg.type] || dispatch['default'])(msg);
}
function Msg1Transaction(msg) {
// some mongodb operation here...
}
但是,當amqp
隊列中有多個具有不同消息字段值的相同類型的消息時,將調用messageReceiverCallback
,並且還將多次調用Msg1Transaction
。 結果,由於我忽略了對mongodb
的異步操作,因此保存在mongodb
的數據將不正確。 在這種情況下如何處理?
我有一個主意,也許添加一個用Promise
包裝的新事務隊列。 因此,可以異步處理事務。 但是我不怎么執行呢? 能幫助我或其他更好的解決方案嗎?
我不熟悉amqp
,但如果我理解你的問題,你想要messageHandler
來當回mongo
操作完成。 在這種情況下,正確的邏輯是:
function messageReceiverCallback(msg) {
try {
messageHandler(decode(msg));
} catch (ex) { ... }
}
function messageHandler(msg) {
Msg1Transaction(msg, callbackAfterTransaction);
}
function callbackAfterTransaction(data){
// update transaction info
}
function Msg1Transaction(msg, callback) {
// some mongodb operation here...
Collection.find ({},
function(err, data)
{
...
callback(data);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.