webContents.send 和 ipcRenderer.on 不工作

Posted

技术标签:

【中文标题】webContents.send 和 ipcRenderer.on 不工作【英文标题】:webContents.send and ipcRenderer.on Not Working 【发布时间】:2019-05-14 03:47:11 【问题描述】:

我对 NodeJS 还很陌生,但我确实对 vanilla JS 有相当多的经验。

在下面的代码中,我到底做错了什么?

它在应用的开发者控制台中没有console.log 任何东西,所以我假设通信渠道以某种方式中断了?

这与readdir 是异步的事实有什么关系吗?

index.js

fs.readdir(__dirname, (err, files)=>
  files.forEach((file, index)=>
    console.log('display', __dirname+'\\'+file) // this prints everything as expected
    mainWindow.webContents.send('display', __dirname+'\\'+file)
    // mainWindow.send(...) doesn't work either
  )
)

index.html

const electron = require('electron')
const ipcRenderer = electron
const con = document.getElementById('con')

ipcRenderer.on('display', (e, arg)=>
  const div = document.createElement('div')
  const txt = document.createTextNode(arg)
  div.appendChild(txt)
   con.appendChild(div)

   console.log(e)   // neither this
   console.log(arg) // nor this prints anything to the app's developer console
 )

这是一个CODEPEN,包含所有代码。

解决方案

事实证明,将 webContents.send 包装在另一个函数中就可以了。但是,我不确定为什么会这样。

mainWindow.webContents.on('did-finish-load', ()=>
  mainWindow.webContents.send('display', __dirname+'\\'+file)
)

有人愿意向我解释为什么我必须将webContents.send 包装在另一个函数中才能正常工作吗?

【问题讨论】:

【参考方案1】:

如果您在创建消息后立即将消息发送到窗口,它将没有时间加载页面并加载 js 来接收消息。

解决方案是将其包装在'did-finish-load' 事件中,以便在发送消息之前等待页面准备好,如下所示:

mainWindow.webContents.on('did-finish-load', function () 
    mainWindow.webContents.send('channelCanBeAnything', 'message');
);

【讨论】:

有道理。所以did-finish-load 事件监听index.html(不是index.js)被加载?这太奇怪了,因为index.js 中的forEach 循环中的console.log 吐出了所有值,但我猜index.html 尚未加载,因此无法侦听或接受传递给的值是吗? @Anthony 是的,就是这样。 你完成了我的一天! @PonzioPilato 很高兴我能帮上忙 :)

以上是关于webContents.send 和 ipcRenderer.on 不工作的主要内容,如果未能解决你的问题,请参考以下文章

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

malloc和free,brk和sbrk和mmap和munmap的使用和关系以及内存分配的原理