Мне нужно синхронизировать некоторые шаги во время запуска моего приложения 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();
...
})
}
}