electron系列:进程间通信之ipcRenderer.invoke 和 ipcRenderer.send 的区别

在 Electron 框架里, ipcRenderer 是用于在渲染进程与主进程间进行通信的模块, ipcRenderer.invoke 和 ipcRenderer.send 都能实现渲染进程向主进程发送消息,但它们存在显著区别,下面详细介绍。

1. 通信模式

  • ipcRenderer.send :采用异步单向通信模式。渲染进程发送消息后,不会主动等待主进程的响应,继续执行后续代码。主进程若要反馈信息,需通过 ipcMain.send 主动发回给渲染进程。
  • ipcRenderer.invoke :采用异步双向通信模式。渲染进程发送消息后会返回一个 Promise 对象,等待主进程处理完成并返回结果,可使用 await 或 .then() 来获取主进程的响应。

2. 消息处理与响应

  • ipcRenderer.send :主进程使用 ipcMain.on 监听消息,处理完成后若要返回信息,需借助 event.sender.send 主动发回给渲染进程。
  • ipcRenderer.invoke :主进程使用 ipcMain.handle 监听消息,直接通过返回值将结果返回给渲染进程,渲染进程通过 Promise 接收结果。

3. 使用场景

  • ipcRenderer.send :适用于无需主进程立即反馈结果的场景,如通知主进程更新界面状态、记录日志等。
  • ipcRenderer.invoke :适用于需要主进程返回处理结果的场景,如文件选择对话框、数据库查询等。

4. 代码示例

(1)ipcRenderer.send 示例

// 渲染进程代码 index.js
const api = {
  resizeView: (options) => ipcRenderer.send('resize-view', options)
}
// 主进程代码 main.js
const { ipcMain } = require('electron');

ipcMain.on('resize-view', (event, options) => {
  // 处理视图调整逻辑
  console.log('收到调整视图的请求:', options);
  // 若需要返回信息给渲染进程
  // event.sender.send('resize-view-response', { status: 'success' });
});

(2)ipcRenderer.invoke 示例

// 渲染进程代码 index.js
const api = {
  createHtmlView: (options) => ipcRenderer.invoke('create-html-view', options),
}
// 主进程代码 main.js
const { ipcMain } = require('electron');

ipcMain.handle('create-html-view', async (event, options) => {
  // 处理创建 HTML 视图的逻辑
  console.log('收到创建 HTML 视图的请求:', options);
  // 返回处理结果给渲染进程
  return { status: 'success', message: 'HTML 视图创建成功' };
});

综上所述,若你需要主进程返回处理结果,就用 ipcRenderer.invoke ;若只是单向通知主进程执行任务,无需即时反馈,就用 ipcRenderer.send 。

参考来源

Trae CN,chat问答。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容