#javascript #electron
#javascript #electron
Вопрос:
У нас есть приложение electron. Мы добавляем / удаляем прослушивателей с помощью
const funct = () => {}
ipcRenderer.on('channel', funct);
// later...
ipcRenderer.removeListener('channel', funct)
Мы хотим убедиться, что в нашем приложении нет утечки обработчиков событий. Как мы будем запрашивать ipcRenderer
всех прослушивателей каналов?
Ответ №1:
ipcRenderer.eventNames()
список всех каналов, у которых есть прослушивателиipcRenderer.rawListeners(channel)
список всех прослушивателей для определенного канала
ipcRenderer.eventNames().forEach(channel => ipcRenderer.rawListeners(channel))
Ответ №2:
У вас нет возможности запрашивать все каналы одновременно. Ближе всего
https://electronjs.org/docs/api/ipc-renderer#ipcrendererremovealllistenerschannel
ipcRenderer.removeAllListeners(channel)
Что вы можете удалить всех прослушивателей для определенных каналов. Вам все равно придется управлять списком каналов самостоятельно.
Комментарии:
1. Я не хочу удалять прослушивателей, просто чтобы узнать, есть они или нет.
Ответ №3:
Поскольку ipcRenderer
и ipcMain
являются узлами EventEmitter
, вы можете использовать базовый API для управления событиями.
eventNames
может использоваться для запроса каждого «канала» и removeAllListeners
может удалять каждого прослушивателя для одного канала
Таким образом, этот код удалит каждого прослушивателя из экземпляра эмиттера
ipcRenderer.eventNames().forEach(n => {
ipcRenderer.removeAllListeners(n)
})
Однако на самом деле вы не должны этого делать! (из документации узла)
Обратите внимание, что плохой практикой является удаление прослушивателей, добавленных в другом месте кода, особенно когда экземпляр EventEmitter был создан каким-либо другим компонентом или модулем (например, сокетами или файловыми потоками).
Комментарии:
1. Я не хочу удалять прослушивателей, просто чтобы узнать, есть они или нет. Тем не менее,
eventNames()
это действительно полезно. Я собрал все, что узнал, и создал ответ. Спасибо за вашу помощь!