【问题标题】:Error when interconnecting ipcRenderer and ipcMain in electron在电子中互连 ipcRenderer 和 ipcMain 时出错
【发布时间】:2017-08-21 18:41:30
【问题描述】:

我已经在 electron 中配置了 cli angular,并且我有一个链接,它执行一个函数,可以将 ipcRenderer 和 ipcMain 相互通信:

html:

<a (click)="check()"> click </a>

组件:

constructor(private _e: ElectronService) { }

check () {
   this._e.ipcRenderer.send ('conn', 'round');
   this._e.ipcRenderer.on ('conn-st', (event, args) => {
      console.log (args);
   });
}

main.js(电子):

ipcMain.on ('conn', function (event, args) {
  event.sender.send ('conn-st', 'trip');
});

问题是,当你点击一次时,你只做一次,但当你再次点击时,它会连续点击 3,然后是 4、5,以此类推。

并在到达 11 时抛出此错误:

(node:23006) Error: Possible EventEmitter memory leak detected. 11 conn-st listeners added. Use emitter.setMaxListeners() to increase limit

如何结束 ipcRenderer 和 ipcMain 之间的连接?

【问题讨论】:

  • 实际上没有“连接”,就像 UNIX 套接字一样,Electron 会向所有侦听器发出信号,然后触发定义的函数。错误消息似乎只说创建了 11 个侦听器,它们都侦听同一个“套接字”。
  • 我该如何重启那些监听器?
  • “重启”可能是错误的词,因为这意味着他们会在那之后继续听。但是每个使用ipcRenderer.on(); 的侦听器(创建时)都会创建一个唯一的ID,并且可以使用ipcRenderer.removeListener(channel, listener); 删除。但请参考Electron doc
  • 非常感谢您对电子的更多帮助,我解决了这个问题:this._e.ipcRenderer.send ('conn', 'test'); this._e.ipcRenderer.on ('conn-st', (event, args) => { console.log (args); this._e.ipcRenderer.removeAllListeners ('conn-st'); });
  • 不客气。我应该创建一个答案以便您接受吗?

标签: javascript node.js angular electron angular-cli


【解决方案1】:

该错误消息仅表明创建了 11 个“套接字”侦听器(如 UNIX 中的侦听器)。每个侦听器都会创建一个唯一的 ID,该 ID 在创建侦听器时会返回。基于此,可以像这样删除一个特定的侦听器:

// Create a listener.
var myListener = function (event, args) {} 
ipcRenderer.on("channel", myListener);

// Delete only this one by its ID:
ipcRenderer.removeListener("channel", myListener);

但您也可以删除为套接字创建的所有侦听器,如下所示:

// Create a few listeners.
var myListener0 = function (event, args) {};
var myListener1 = function (event, args) {};
var myListener2 = function (event, args) {};
var myListener3 = function (event, args) {};

//
ipcRenderer.on("channel", myListener0);
ipcRenderer.on("channel", myListener1);
ipcRenderer.on("channel", myListener2);
ipcRenderer.on("channel", myListener3);

// Delete all listeners for socket "channel".
ipcRenderer.removeAllListeners("channel");

这也包含在 Electron 文档中,特别是 here

【讨论】:

    【解决方案2】:

    根据电子文档documentation,接受的答案不再正确。监听器是一个函数,应该如下所示被移除。

    // Create a listener
    let listener = (event, args) => {}
    ipcRenderer.on("channel", listener );
    
    //Delete the listener
    ipcRenderer.removeListener("parse-cm-request", listener);
    

    【讨论】:

    • 请编辑接受的答案以反映更改
    猜你喜欢
    • 2018-10-03
    • 2020-11-03
    • 2021-07-22
    • 1970-01-01
    • 2021-11-02
    • 2016-08-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多