Определение обработчика EventEmitter в другом модуле, не экспортирующем функциональность

#node.js #events #es6-modules #eventemitter

#node.js #Мероприятия #es6-модули #eventemitter

Вопрос:

У меня есть EventEmitter экземпляр, объявленный и экспортированный в одном модуле (допустим index.ts ) следующим образом

 class Logger extends EventEmitter {};

/* Logger instance */
export const logger: Logger = new Logger();
 

в другом модуле я импортировал этот logger экземпляр и определил несколько обработчиков. ( handlers.ts )

 logger.on(LOG_TRIGGER, (data: ILogTrigger): void => {
  const symbol: string = data.symbol;
  const change: number = data.change;
  const price: number = data.last_price;
  logger.logTrigger(symbol, price, change);
});
 

Но когда я импортирую экземпляр регистратора во внешний модуль из index.ts файла и генерирую события. Он не запускается. Но он запускается, когда оба обработчика и объявление находятся в одном файле. Что здесь происходит?

Экспорт класса в модуль обработчика — это решение, но мой вопрос заключается в следующем: можем ли мы экспортировать экземпляр класса и определить для него дополнительные обработчики в отдельном модуле?

Комментарии:

1. Похоже, вы отправляли события, даже не загружая handlers.ts модуль в свое приложение?

2. Я экспортировал экземпляр регистратора из ‘index.ts’ и импортировал его в handler.ts, где я определил обработчики событий. Есть ли какой-либо способ сделать это и при этом иметь возможность передавать данные из других модулей. Обратите внимание, что класс создается и затем экспортируется до того, как обработчики событий будут определены в другом модуле.

3. Да, это работает. Но вам нужно фактически загрузить и выполнить handlers.ts (например import , в вашем модуле entrypoint), чтобы установить обработчики, поскольку от этого больше ничего не зависит. Вы это делаете? Если да, пожалуйста, опубликуйте и этот код, если нет, в этом проблема.

Ответ №1:

Я понял, что модуль, в котором я определяю свой обработчик событий, вообще не доступен процессу. Импорт внешнего модуля, в котором я определил свои обработчики, в модуль, в котором инициализируется экземпляр источника событий [ИЛИ] Импорт в основной процесс, в котором инициируется код, помог решить эту проблему.

 import "./external-handler-module.ts"
 

Это делает код «доступным» для процесса приложения.