ipcRenderer¶
channel字符串listener函数eventIpcRendererEvent...argsany[]
从指定 channel 的监听器数组中移除指定的 listener。
ipcRenderer.once(channel, listener)¶
channel字符串listener函数eventIpcRendererEvent...argsany[]
为事件添加一个一次性 listener 函数。此 listener 仅在下一次向 channel 发送消息时被调用,之后会被移除。
ipcRenderer.addListener(channel, listener)¶
channel字符串...argsany[]
返回 Promise<any> - 以主进程的响应作为解析值。
通过 channel 向主进程发送消息,并异步期望一个结果。参数将使用 结构化克隆算法 进行序列化,就像 [window.postMessage][] 一样,因此原型链不会被包含。发送函数、Promise、Symbol、WeakMap 或 WeakSet 会抛出异常。
主进程应使用 ipcMain.handle() 监听 channel。
例如:
```js @ts-type={someArgument:unknown} @ts-type={doSomeWork:(arg:unknown)=>Promise
// Main process ipcMain.handle('some-name', async (event, someArgument) => { const result = await doSomeWork(someArgument) return result })
如果需要将 [`MessagePort`][] 传输到主进程,请使用 [`ipcRenderer.postMessage`](#ipcrendererpostmessagechannel-message-transfer)。
如果不需要对消息进行响应,请考虑使用 [`ipcRenderer.send`](#ipcrenderersendchannel-args)。
> [!NOTE]
> 发送非标准 JavaScript 类型(例如 DOM 对象或特殊的 Electron 对象)会抛出异常。
>
> 由于主进程不支持 `ImageBitmap`、`File`、`DOMMatrix` 等 DOM 对象,因此无法通过 Electron 的 IPC 将这些对象发送到主进程,因为主进程无法解码它们。尝试通过 IPC 发送此类对象会导致错误。
> [!NOTE]
> 如果主进程中的处理函数抛出错误,
> `invoke` 返回的 Promise 将被拒绝。
> 但是,渲染进程中的 `Error` 对象
> 与主进程中抛出的对象并不相同。
### `ipcRenderer.sendSync(channel, ...args)` {#ipcrenderersendsynchannel-args}
* `channel` string
* `...args` any[]
返回 `any` - 由 [`ipcMain`](ipc-main.md) 处理函数返回的值。
通过 `channel` 向主进程发送消息,并同步等待结果。参数会使用 [结构化克隆算法][SCA] 进行序列化,
与 [`window.postMessage`][] 一样,因此不会包含原型链。发送函数、Promise、Symbol、WeakMap 或 WeakSet 会抛出异常。
> **注意:** 发送非标准 JavaScript 类型(例如 DOM 对象或
> 特殊的 Electron 对象)会抛出异常。
>
> 由于主进程不支持 `ImageBitmap`、`File`、`DOMMatrix` 等 DOM 对象,
> 因此无法通过 Electron 的 IPC 将这些对象发送到主进程,因为主进程没有方式解码
> 它们。尝试通过 IPC 发送此类对象会导致错误。
主进程通过 [`ipcMain`](ipc-main.md) 模块监听 `channel` 来处理它,
并通过设置 `event.returnValue` 进行回复。
> [!WARNING]
> 发送同步消息会阻塞整个
> 渲染进程,直到收到回复,因此请仅将此方法作为
> 最后手段使用。最好使用异步版本,
> [`invoke()`](ipc-renderer.md#ipcrendererinvokechannel-args).
### `ipcRenderer.postMessage(channel, message, [transfer])` {#ipcrendererpostmessagechannel-message-transfer}
<!--
```YAML history
added:
- pr-url: https://github.com/electron/electron/pull/22404
channelstringmessageanytransferMessagePort[] (可选)
向主进程发送消息,可选择转移零个或多个 [MessagePort][] 对象的所有权。
转移的 MessagePort 对象可以在主进程中通过访问发出事件的 ports
属性,作为 MessagePortMain 对象使用。
例如:
// Renderer process
const { port1, port2 } = new MessageChannel()
ipcRenderer.postMessage('port', { message: 'hello' }, [port1])
// Main process
ipcMain.on('port', (e, msg) => {
const [port] = e.ports
// ...
})
有关使用 MessagePort 和 MessageChannel 的更多信息,请参阅
MDN 文档.
ipcRenderer.sendToHost(channel, ...args)¶
channelstring...argsany[]
与 ipcRenderer.send 类似,但事件将发送到宿主页面中的 <webview> 元素,
而不是主进程。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron