Я закончил тем, что создал свой собственный модуль, чтобы делать то, что мне нужно, то есть иметь возможность подписаться на приложение pub / sub и публиковать в другом приложении, выполняя некоторую асинхронную работу между ними, но сохраняя порядок, в котором сообщенияпринимаются подписчиком.
С этим модулем я могу выполнить orderedPubSub.publish(id, message)
в обратном вызове асинхронной работы, которую мне нужно выполнить при получении события из первого приложения, и otherApplication.publish(message)
в on("message")
моего модуля OrderedPubSub.
Хотелось бы, чтобы был другой способ сделать это или модуль уже в NPM.
const EventEmitter = require('events');
class OrderedPubSub extends EventEmitter {
constructor(initialId = 0) {
super()
this.lastPublishedId = initialId
this.messages = {}
}
publish(id, message) {
this.messages[id] = message
this.publishAllAvailable()
}
publishAllAvailable() {
let messageId;
while((messageId = this.lastPublishedId + 1) in this.messages) {
const message = this.messages[messageId]
delete this.messages[messageId]
this.lastPublishedId++
this.emit("message", message)
}
}
}
const orderedPubSub = new OrderedPubSub();
orderedPubSub.on('message', message => {
console.log(`Received message: "${message}"`)
});
orderedPubSub.publish(3, "third message")
orderedPubSub.publish(2, "second message")
orderedPubSub.publish(4, "fourth message")
orderedPubSub.publish(10, "tenth message")
orderedPubSub.publish(1, "first message")
//outputs
// Received message: "first message"
// Received message: "second message"
// Received message: "third message"
// Received message: "fourth message"