如何在Nodejs中处理异步事务

时间:2015-04-10 09:00:09

标签: javascript node.js mongodb asynchronous promise

我的应用程序基于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的新事务队列。因此可以异步处理事务。但我不知道如何实施呢?可以帮助我或其他一些更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我不熟悉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);
    }
}