网站搜索

javascript - 在 Nestjs EventEmitter 模块和无服务器函数中使用异步事件监听器


我正在尝试在服务器无服务器的 Lambda 函数中实现一个异步工作器,并借助 NestJS 的 EventEmitter 模块。

在触发事件时处理程序被调用,但该函数在异步/等待调用之前就关闭了。

我已经尝试使用 emit 和 emitAsync 函数,以及不同的参数用于 @OnEvent(AccountEvents.NEW_ACCOUNT, {async:true, promisify:true})

制作人片段

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

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

监听器片段

@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);
    });
  }

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

答案#1

按如下方式进行更改是可行的。基本上我们需要将 { 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 });
  }