一、ipcMain
ipcMain 模块是类 EventEmitter 的实例。当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息,从渲染进程发送过来的消息将触发事件。
1、发送消息
- 发送消息,事件名为
channel.
- 回应同步消息, 你可以设置
event.returnValue。
- 回应异步消息, 你可以使用
event.sender.send(...)。
例子:
// 主进程中
const ipcMain = require('electron').ipcMain;
ipcMain.on('asynchronous-message', function(event, arg) {
console.log(arg); // prints "ping"
event.sender.send('asynchronous-reply', 'pong');
});
ipcMain.on('synchronous-message', function(event, arg) {
console.log(arg); // prints "ping"
event.returnValue = 'pong';
});
// 渲染进程中(web page).
const ipcRenderer = require('electron').ipcRenderer;
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')); // prints "pong"
ipcRenderer.on('asynchronous-reply', function(event, arg) {
console.log(arg); // prints "pong"
});
ipcRenderer.send('asynchronous-message', 'ping');
从上面的代码中我们可以看出,
- 同步消息使用 sendSync 方法,在发出的瞬间即可接收到响应内容。
-
异步消息使用 send 方法,之后需要监听异步事件才能得到响应。
2、监听消息
(1)ipcMain.on(channel, listener)
channelStringlistenerFunction
监听 channel,当新消息到达时将通过 listener(event, args...) 调用 listener。
(2)ipcMain.once(channel, listener)
channelStringlistenerFunction
为事件添加一个一次性用的 listener 函数。这个 listener 只有在下次的消息到达 channel 时被请求调用,之后就被删除了。
(3)ipcMain.removeListener(channel, listener)
channelStringlistenerFunction
为特定的 channel 从监听队列中删除特定的 listener 监听者。
(4)ipcMain.removeAllListeners([channel])
channelString (可选)
删除所有监听者,或特指的 channel 的所有监听者。
3、事件对象
(1)event.returnValue
将此设置为在一个同步消息中返回的值。
(2)event.sender
返回发送消息的 webContents ,你可以调用 event.sender.send 来回复异步消息。
二、ipcRenderer
ipcRenderer 模块是一个 EventEmitter 类的实例。它提供了有限的方法,你可以从渲染进程向主进程发送同步或异步消息, 也可以收到主进程的响应。
1、发送消息
(1)ipcRenderer.send(channel[, arg1][, arg2][, ...])
channelStringarg(可选)
通过 channel 向主进程发送异步消息,也可以发送任意参数。参数会被JSON序列化,之后就不会包含函数或原型链。
主进程通过使用 ipcMain 模块来监听 channel 来处理消息,通过 event.sender.send() 来响应。
(2)ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])
channelStringarg(可选)
通过 channel 向主进程发送同步消息,也可以发送任意参数。参数会被JSON序列化,之后就不会包含函数或原型链。
主进程通过使用 ipcMain 模块来监听 channel,从而处理消息, 通过 event.returnValue 来响应.
注意: 发送同步消息将会阻塞整个渲染进程,除非你知道你在做什么,否则就永远不要用它。
(3)ipcRenderer.sendToHost(channel[, arg1][, arg2][, ...])
channelStringarg(可选)
类似 ipcRenderer.send ,但是它的事件将发往 host page 的 <webview> 元素,而不是主进程。
2、监听消息
(1)ipcRenderer.on(channel, listener)
channelStringlistenerFunction
监听 channel,当有新消息到达,使用 listener(event, args...) 调用 listener。
(2)ipcRenderer.once(channel, listener)
channelStringlistenerFunction
为这个事件添加一个一次性 listener 函数。这个 listener 将在下一次有新消息被发送到 channel 的时候被请求调用,之后就被删除了。
(3)ipcRenderer.removeListener(channel, listener)
channelStringlistenerFunction
从指定的 channel 中的监听者数组删除指定的 listener。
(4)ipcRenderer.removeAllListeners([channel])
channelString (optional)
删除所有的监听者,或者删除指定 channel 中的全部。
(SAW:Game Over!)
本文深入解析Electron应用中的IPC (Inter-Process Communication) 主要模块:ipcMain与ipcRenderer的功能与用法。详细介绍了如何在主进程与渲染进程中发送同步及异步消息,以及如何监听与响应这些消息。
3874

被折叠的 条评论
为什么被折叠?



