Electron JS event is firing multiple times

2.9k views Asked by At

In electronJS, I have created a custom application menu in which I'm sending the event from main process to renderer process, but now what happening is where I'm listening this event is running multiple times. So, if anyone could help me to find and resolve the error. Thanks. Here's my code:

label: test,
          click: function (item, focusedWindow, event) {
            mainWindow.webContents.send('test')
          }

ipcRenderer.on('test', (event, action) => {
      console.log('called')
    })

Now this console.log is printed multiple times.

original code:

{
  label: constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.LABEL,
  accelerator: constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.ACCELERATOR,
  click: function (item, focusedWindow, event) {
    contents.send(constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.EVENT)
  }
}

created: function () {
ipcRenderer.on(constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.EVENT, () => {
  console.log('clicked')
})

},

3

There are 3 answers

1
Kevin Arthur Lara Jauregui On BEST ANSWER

Try using ipc.removeAllListeners('your_name_channel') in your closed window function:

Your_Window.on('closed',()=>{
    ipc.removeAllListeners('your_name_channel');
})
3
ALW On

ipcRenderer.on continuously listens, while once is only invoked for the next event - then removed.

ipcRenderer.once(*channel*, *listener*)

Source: http://man.hubwiz.com/docset/electron.docset/Contents/Resources/Documents/docs/api/ipc-renderer.html

0
Abhishek Matta On

So after a lot of searching I found the answer.If you are switching the routes and registered some channels on one component and some on other, So you can remove the listeners for the particular channels in a lifecycle method(destroyed) when the component is unmounted. My issue was I was switching between routes and every time created was running in which I registered ipc renderer to listen to those channels. So i removed the listeners to the channels in destroyed lifecycle hook.

It can be done by:

ipcrenderer.removeAllListeners([channel])

Here's is the link for docs: Electron