amqp回调确认:真的不行

时间:2017-06-09 23:53:43

标签: javascript node.js asynchronous callback

我是NodeJS的新手,我们正在使用amqp 0.2.6。我有看起来像

的伪代码
async.waterfall([
    function(callback) {
         // do logic and pass parameters to next method by calling callback
    },

    function(params, callback) {
         // do AMQP logic and pass parameters to next method
            try {       
          bus.publish(routingKey, message, options, function (err) {
                 console.log("got here");
                 if (err) {
                      console.log(err);
                 }
          });
        //callback(null, null);    
    } catch (err) {
        console.log("ERROR: " + err);
        //callback(err, null);
    }


    }
], function() {
        // do logic with all results
});

所以我有几个问题。首先,当我调用发布时,我的回调有问题吗?我的消息被正确发送到Rabbit但我从未收到回调got here消息。

如果我取消注释以回调开头的两行,那么我在async.waterfall中的第二个函数立即得到它的回调,然后调用它的回调将结果传递给async.waterfall中的最终函数。我确实理解这种情况正在发生,因为回调在发布后立即被调用。在我知道发送给兔子的消息是否成功没有错误或错误之后,我想要做的是理想地调用回调。我不知道如何做到这一点,因为我无法得到amqp发布消息的回调。我确实在我的try / catch块中看到如果有错误,我看到我的错误被记录,但这是在我的async.waterfall函数已经完成之后。我想将我的发布消息(成功或失败)的结果传递给async.waterfall中的第二个函数。我能做到的任何非阻塞方式都很好。所以最终的目标是

async.waterfall([
    function (one) {
         // do logic and pass results to 'two'
    }, 
    function (two) {
         // do AMQP logic, send a message, get the results of that action and pass to last function
    }
], function() {
        // i got my results from 'one' and 'two', do some more logic
});

1 个答案:

答案 0 :(得分:0)

您只需将瀑布回调作为bus.publish()回调传递即可。这将在bus.publish()完成后调用该回调,并且async.waterfall()中的最终函数将出错(如果传递错误)和/或来自bus.publish()的结果。

更新代码的示例可能如下所示,但您可以对其进行调整以满足您的需求。

async.waterfall([
    function(callback) {
         // do logic and pass parameters to next method by calling callback
         callback(null, params)
    },

    function(params, callback) {
         // do AMQP logic and pass parameters to next method    
         bus.publish(routingKey, message, options, callback)
    }
], function(err, result) {
        // err:    if an error is thrown and passed into the callback for bus.publish(), should be set here, otherwise should be `null` 
        // result: if bus.publish() gives you a result in the callback after it publishes the message, would be here
})