【问题标题】:Nestjs event emitter alternative with callback带有回调的 Nestjs 事件发射器替代方案
【发布时间】:2021-08-15 06:01:22
【问题描述】:

我正在试验和学习nestjs,但我无法为以下场景找到合适的解决方案:

模块用户

模块书

模块仪表板

仪表板是一个graphql,可以解决他调用图书服务和图书用户服务的需求。

我只知道解决一本书的顺序,同时更新用户信息的两种方法。

1- 在 graphql 仪表板上使用一个突变,该突变还调用一个事件,该事件将被相应的服务监听,该服务将更新这个新订单,这里是这个用例的例子:https://github.com/nestjs/nest/tree/master/sample/30-event-emitter

2- 使用依赖注入考虑仪表板具有用户和书籍的相应服务的依赖关系,并简单地更新所需的一切。

问题:

解决方案 1 事件不提供回调或响应,它充当事件的发射,之后我无法获得反馈,更像是一个动作或命令而不是一个函数。

方案2仪表盘知道的太多了,我不需要提供整个模块作为DI,在订单发生后只调用一个方法来更新用户信息。

我需要什么,但我没有找到任何软件。一个在它执行后我可以监听的事件......换句话说,类似于以下内容:

export interface OrderResults {
  user: UserCustomer;
  order: OrderCreated;
}

@Injectable()
export class Dashboard {
  constructor(private reaonly eventEmitter: EventEmitter2): Promise<OrderResults> {}
  async createOrder(order) {
    const orderEventResults = await this.eventEmitter.emit('create.order', order)
    return orderEventResults
  }
}

订单事件的结果,是用户和订单得到了正确的通知和更新,通过用户/订单的监听器的结果来解决。

我的仪表板完全不知道如何或由谁来处理此问题,但会向客户提供与此事件相对应的结果,这些结果由负责此事件的服务解决。

我们欢迎任何有关这方面的帮助或指导。

【问题讨论】:

  • 我不认为你可以发出事件并等待它们的结果发回响应,所以我会选择解决方案#2。如果您担心仪表板知道的太多,也许您可​​以根据仪表板的需要创建另一个服务(?)
  • 可能与 rxjs 或观察发生的事件有关,老实说,如果我有一个动作命令或一个事件,我觉得我听起来不像,为什么不是我可以等待其他服务的功能。可能对框架的意见或范围来说这是一个不好的做法,或者我应该尝试以不同的方式这样做......

标签: javascript node.js typescript nestjs


【解决方案1】:

我不熟悉 Nest,但是使用 Nest 的 EventEmitter2emitAsync 方法,所以它应该可以工作:

 const orderEventResults = await this.eventEmitter.emitAsync('create.order', order)
    return orderEventResults

【讨论】:

  • 你说得对,它已经很晚了,我刚刚看到返回给我一个布尔值的发射,谢谢
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多