尝试使用 async / await 语法从发布商使用消费者请求。 E.g:
await makeRequest(ch, queueName, cbQueueName, message)
// ...
const makeRequest = (ch, queueName, cbQueueName, message) => {
let corr = generateUuid();
return new Promise(resolve => {
ch.sendToQueue(this.loadQueueName, new Buffer(prGuid), { correlationId: corr, replyTo: cbQueueName});
const prID = getprid();
console.log("Call from promise #" + prID);
ch.consume(cbQueueName, function(msg) {
console.log("Response to promise #" + prID);
if (msg.properties.correlationId == corr) {
console.log(msg.content.toString());
resolve();
}
}, {noAck: true})
});
}
let i = 0;
const getprid = () => {
i++;
return i;
}
问题是消费者的响应是绝对随机的 Promise 实例。所以第一次调用工作正常,因为没有其他实例可以混用。在第一次回答之前定义的随机承诺实例后,消费者会得到响应。由于已发布消息中的 correlationId 与响应中的 correlationId 不同,因此在首次调用后,resolve方法永远不会触发。
是否有办法阻止消费者对完全 承诺 的反应?请求是否已被发布?或者这是一个不错的方法来自beginnig?
Basicaly我需要使用参数向消费者发送消息,并等待它使用 async / await 进行响应。