如何重新分配重复执行的侦听器函数的结果?



我有一个从RabbitMQ消耗队列的函数,我想保存每次执行的结果来运行一些其他代码(例如在数据库中保存一些东西)。

这里的问题是,它只保存了一次,监听器保持工作良好,并获得该信息作为函数内的代码不断执行,因为我添加更多的事件队列,但没有重新分配执行的结果到该变量:

下面是我的代码:

控制器(调用消费者)

async run() {
const eventData = await this.eventManager.consume(QueuesToConsume.USER_CREATED)
await this.createUserUseCase.run(eventData);
}

RabbitMQ消费者

async consume(queue: string): Promise<DomainEvent> {
let eventData: DomainEvent;
return new Promise<DomainEvent>(async (resolve, reject) => {
await this.channel.consume(queue, async (msg: Message) => {
console.log(`Message: n ${Buffer.from(msg.content)} n received successfully!`)
await this.channel.ack(msg)
eventData = JSON.parse(Buffer.from(msg.content).toString('utf8'))
console.log('Message acknowledged successfully')
resolve(eventData);
}).catch(err => {
console.log(`Error consuming the message: n ${err}`)
reject(err)
});
})
}

所以这不能正常工作,因为控制器中的eventData不能得到每个响应,并且useCase只能在第一次执行。

我怎么能修复这个eventData获得每一个结果的消费者返回?

PS:请注意,我没有复制整段代码,因为它是不必要的,我可以很高兴地复制它,如果你需要它给我一个正确的答案!

我发现了一些其他的堆栈溢出论坛,讨论了这一点,总结来说,这是不能做到的,无论是用承诺还是用传统的异步等待,一个变量不能只是重新分配给一个值每次监听器监听的东西。

我已经找到了一个解决方案,允许我在一开始就使用观察者/主题设计模式实现我想要的,在这个模式中,RabbitMQ消费者将成为主题,也将用新事件通知观察者。

如果你想让事件触发两个动作或用例而不是一个,这种方法也很有帮助,你只需要添加一个观察者的新动作,就可以了!

最新更新