electron - 电子 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")
} )
我已经尝试了很多东西,如果需要,我很乐意提供更多信息。这是什么原因造成的?我如何解决它?
解决方案
您正在使用ipcRenderer.once(channel, listener)。其目的是注册一个一次性事件处理程序,该事件处理程序在触发后将被删除。将其更改为ipcRenderer.on(channel, listener)
ipcRenderer.once(通道,监听器)
• channel String • listener Function event IpcRendererEvent ...args any[]
为事件添加一次性监听函数。仅在下一次将消息发送到通道时调用此侦听器,之后将其删除。
推荐阅读
- binding - UWP ListView ItemTemplate 缩略图错误
- python - 使用循环按 pd.dataframe 的列生成列表
- python - 傅里叶变换 opencv python FFT & DFT
- php - PHP session_start 没有在响应中设置 Set-Cookie 标头
- laravel - 放入表格时,Laravel orderBy 数据正在洗牌
- hashmap - 使用入口模式时如何改变 HashMap 的其他元素?
- ios - 无法为时间字符串加载 IOSurface。在本地渲染而不是 swift 4
- ruby-on-rails - 来自 Action Mailer Rails 的动态默认值
- java - apache poi - 缺少单元格数据
- spring - Spring boot Neo4j - 动态投影