NodeJS событий, запускаемых несколько раз в приложении электронной реакции - PullRequest
1 голос
/ 07 марта 2020

У меня есть пакет (скажем, 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 или что-то еще? Что я здесь не так делаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...