【发布时间】: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