javascript - Async-tapahtumakuuntelijan käyttäminen Nestjs EventEmitter -moduulin ja serverittömien funktioiden kanssa


Yritän toteuttaa asynkronisen työntekijän serverittömällä lambda-funktiolla nestjs EventEmitter -moduulin avulla.

Käsittelijää kutsutaan tapahtumaa lähetettäessä, mutta funktio sulkeutuu ennen async/await -kutsua.

Olen kokeillut käyttää sekä emit että emitAsync -funktioita ja erilaisia argumentteja @OnEvent(AccountEvents.NEW_ACCOUNT, {async:true, promisify:true}) varten

Tuottajan pätkä

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

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

Kuuntelijan pätkä

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

Odotettu tulos: kaikki kolme lokimerkintää Todellinen tulos: vain ensimmäinen lokimerkintä (Log1)

Vastaus #1

Muutosten tekeminen seuraavasti toimii. Periaatteessa meidän täytyy välittää { async: true, promisify: true } annotaatioon @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 });
  }