У меня есть пакет (скажем, PACKAGE_A
), написанный для выполнения некоторых задач. Тогда требуется PACKAGE_B
. PACKAGE_A
- это скрипт узла для некоторых работ по автоматизации. Он имеет этот модуль уведомлений для создания и экспорта EventEmitter. (Весь проект - Monorepo)
const EventEmitter = require('events');
let myNotifier = new EventEmitter();
module.exports = myNotifier;
Так что в некоторых функциях в PACKAGE_A
он генерирует событие, требуя myNotifier
, а также в index.js
из PACKAGE_A
, я экспортирую функции ( API, доступный для других пакетов) и myNotifier
, требуя его снова.
const myNotifier = require('./myNotifier);
const func1 = () => {
// some function
return something;
}
module.exports = {func1, myNotifier}
Затем я импортирую PACKAGE_A
в PACKAGE_B
и использую функции API, предоставляемые уведомителем. PACKAGE_B
- электронное приложение с пользовательским интерфейсом React.
Ниже описывается, как работает программа.
У меня есть окно вывода консоли в электронном приложении (React UI, UI_A ). <= (имейте это в виду) </p>
Когда я нажимаю кнопку в UI_A , она запускает избыточное действие (button_action
). Внутри действия отправляется уведомление о событии, которое прослушивается в электронном коде с использованием ipcRenderer.
ipcRenderer.send('button-clicked', data); // <= this is not the full code of the action. It's bellow.
Затем в электронном коде (индекс. js) мне требуется другой файл (UI_A_COM.js
который содержит код, относящийся к UI_A на стороне электронов). Причина в разделении кода. Вот часть кода в index.js
, относящаяся к электрону.
const ui_a_com = require('./electron/UI_A_COM');
const createWindow = () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
},
resizable: false,
});
mainWindow.loadURL('http://localhost:3000');
const mainMenu = Menu.buildFromTemplate(menuTemplate);
ui_a_com (mainWindow);
};
Хорошо. Затем в UI_A_COM.js
я прослушиваю это запущенное событие button-clicked
.
ipcMain.on ('button-clicked', someFunction);
, которое запускает код из PACKAGE_A
и вернуть результат. Так что теперь, когда запускается PACKAGE_A
, он генерирует некоторые события, используя myNotifier
. Я слушаю их в том же файле (UI_A_COM.js
), и когда эти события записываются, я снова отправляю некоторые события в пользовательский интерфейс React, который подписывается при срабатывании button_action
.
myNotifier.on('pac_a_event_a', msg => {
mainWindow.webContents.send('ui_event_a', msg); // code in `UI_A_COM.js`
});
Вот полный код для акции. (Не предоставил ранее, потому что вы запутаетесь)
export const buttonAction = runs => {
return dispatch => {
ipcRenderer.send('button-clicked', data);
ipcRenderer.on('ui_event_a', (event, msg) => {
dispatch({ type: SOME_TYPE, payload: { type: msg } });
});
};
};
Это покажет сообщение в консоли UI_A .
Итак это задача, которую я делаю. Проблема в том, когда я нажимаю кнопку; это работает отлично в первый раз. Но когда я нажимаю кнопку во второй раз, он получил два сообщения. Затем, когда я нажимаю на кнопку еще раз, три сообщения, и он продолжает расти. (но функции в PACKAGE_A выполняются только один раз за нажатие кнопки).
Допустим, сообщение от PACKAGE_A
испускается 'Hello there' за исполнение.
Когда я нажимаю кнопку Первый раз идеальный результат => Привет, когда я снова нажимаю кнопку => Привет, там. Привет, Когда я нажимаю на него снова.>> Привет, там. Привет, привет!.
. Я думаю, что моя реализация EventEmitter имеет несколько потоков. Так почему же так происходит? Это EventEmitter или что-то еще? Что я здесь не так делаю?