将异步事件监听器与 Nestjs EventEmitter 模块和无服务器函数结合使用

sed*_*dhu 5 javascript eventemitter serverless-framework nestjs

我正在尝试在 Nestjs EventEmitter 模块的帮助下实现具有无服务器 lambda 函数的异步工作线程。

处理程序在发出事件时被调用,但该函数在 async/await 调用之前关闭。

我尝试过同时使用emitandemitAsync函数和不同的参数 @OnEvent(AccountEvents.NEW_ACCOUNT, {async:true, promisify:true})

制作人片段

  public async execute(event: EventDetail): Promise<void> {

    await this.eventEmitter.emitAsync(AccountEvents.NEW_ACCOUNT, event);
  }

Run Code Online (Sandbox Code Playgroud)

听众片段

@OnEvent(AccountEvents.NEW_ACCOUNT)
  public async handleAccountCreatedEvent(event: EventDetail): Promise<void> {
    this.logger.log({ message: `Log1: ${AccountEvents.NEW_ACCOUNT} Handler`, event });
    const message = await this.testAsync();
    this.logger.log({ message });
    this.logger.log({ message: 'Log 3: Event Processing Successfuly Completed' });
  }

  private testAsync(): Promise<string> {
    return new Promise(res => {
      setTimeout(() => {
        res('Log 2: Promise resolved after one sec');
      }, 1000);
    });
  }

Run Code Online (Sandbox Code Playgroud)

预期输出:所有 3 个日志语句实际输出:仅第一个日志语句 (Log1)

sed*_*dhu 3

进行如下更改是有效的。基本上我们需要传递{ async: true, promisify: true }到注释@onEvent

 @OnEvent(AccountEvents.NEW_ACCOUNT, { async: true, promisify: true })
  async handleNewAccountEvent(event: IEvent<RootAccountInterface>): Promise<void> {
    const eventDetail: RootAccountInterface = event.data;
    this.logger.log({ message: ` ${AccountEvents.NEW_ACCOUNT} Handler`, event });
    await this.abc.logNewAccountCreation(eventDetail.accountId);

    this.logger.log({ message: ` ${AccountEvents.NEW_ACCOUNT} Handled Successfully`, event });
  }
Run Code Online (Sandbox Code Playgroud)