我是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
});
答案 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
})