webContents.send和ipcRenderer.on无法正常工作

时间:2018-12-12 23:58:45

标签: node.js events electron ipc

我对NodeJS很陌生,但是我对香草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 个答案:

答案 0 :(得分:1)

  

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

如果在创建窗口后立即向窗口发送消息,则没有时间加载页面,并且如果接收该窗口的js没有加载,也不会发生任何事情。但是,如果您在加载时发送它('did-finish-load'就是这样做的),那么js准备接收该事件。