#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"
Это делает код «доступным» для процесса приложения.