首页 > 解决方案 > 电子 IPC 行为不一致

问题描述

我已经连接了 ipc 并提前发送了消息,但是当我稍后在 onclick 中调用 ipc 时,它失败了。

我使用 ipc 是因为我想与文件系统进行通信以进行某些设置。它在 Main 中运行良好:

ipcMain.on("settings", (event, arg) => {
      console.log("Writing muting to settings: " + arg.settings)
      switch(arg.settings){
        case "mute_status":
          event.reply("settings_reply", settings.muted)
          break;
        case "mute:true":
          event.reply("settings_reply", "muted set to true")
        default:
          event.reply('settings_reply', 'Sure thing, got it')
      }
    })

渲染器:

ipc.sendSync('settings',{"settings": "mute_status"})
ipc.once('settings_reply', (event, arg) => {
    console.log('Muted is: ' + arg)
    if(arg){    
        place_icon("mute", "volume_div")
        document.getElementById("audio").muted = true
    } else {
        place_icon("volume-up", "volume_div")
    }
})

当我后来打另一个电话时,它有时会起作用(如果我重新启动 Windows,几乎总是如此)。每次运行程序时,它要么有效,要么无效。第二个调用在渲染器中连接到 main.js 中的相同:

ipc.sendSync("settings", {"settings": "mute:" + muted})
    
ipc.once('settings_reply', (event, arg) => {
 console.log("We're talking")
} )

我已经尝试了很多东西,如果需要,我很乐意提供更多信息。这是什么原因造成的?我如何解决它?

标签: electron

解决方案


您正在使用ipcRenderer.once(channel, listener)。其目的是注册一个一次性事件处理程序,该事件处理程序在触发后将被删除。将其更改为ipcRenderer.on(channel, listener)

ipcRenderer.once(通道,监听器)

• channel String
• listener Function
    event IpcRendererEvent
    ...args any[]

为事件添加一次性监听函数。仅在下一次将消息发送到通道时调用此侦听器,之后将其删除。


推荐阅读