Является ли это хорошим решением для реализации синхронного источника событий (ожидание обратного вызова событий во время передачи) - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно синхронизировать некоторые шаги во время запуска моего приложения NodeJs: объявление таблиц базы данных, создание маршрутов. Я столкнулся с необходимостью создания синхронного обработчика событий в том смысле, что мне нужно ждать окончания всех обратных вызовов.

Противопоказано ли его использование? Я видел позиции с различными мнениями. Я сделал следующую реализацию, но я не знаю, является ли это эффективным решением.

export class SyncHook {
  constructor () {
    this.events = new EventEmitter();
  }

  async onEvent (event, fn) {
    this.events.on(event, async tableElements => {
      await fn(tableElements);
      this.events.emit('done');
    });
  }

  async syncEvent (event, ...args) {
    this.eventSolved = 0;
    this.awaitingListeners = this.events.listenerCount(event);
    return new Promise(resolve => {
      this.events.on('done', () => {
        ++this.eventSolved;
        if (this.eventSolved === this.awaitingListeners) {
          this.events.removeAllListeners('done');
          return resolve();
        }
      });
      this.events.emit(event, args);
    });
  }
};

Я использую его следующим образом в своем классе

class DatabaseComponent extends SyncHook {

  onTableDeclaration (fn) {
    this.onEvent('tableDeclaration', fn);
  }


  async registerTable (...) {
    ...
    await this.syncEvent('tableDeclaration', tableElements);
  }
}

class A {
  constructor () {
    database.onTableDeclaration (async tableElements => {
      ...
      await blah();
      ...
    })
  }
}
...