我有以下的通信
//main process
ipcMain.on('asynchronous-message', (event, arg) => {
getFile()
mainWindow.webContents.send('asynchronous-message',contents)
mainWindow.openDevTools();
})
async function getFile(){
const {filePaths} = await dialog.showOpenDialog({properties:['openFile']});
contents = fs.readFileSync(filePaths[0],'utf-8')
}
//renderer process
function openFS(){
ipc.send('asynchronous-message', 'ping')
ipc.on('asynchronous-message',(event,arg)=>{
console.log(arg)
})
}
在主进程中,我有getFile
函数,它是获取文件内容但是ipc.Main
不等待它,它立即返回未定义的渲染进程,这是它在dev tools
上打印的
我肯定知道这一点,因为如果我删除显示打开对话框并硬编码我想要获取的文件的路径,它会成功地在dev tools
中打印文件的内容,因为它不需要在文件系统上花费时间
您的消息处理程序是同步的,因此触发getFile
调用,但处理程序不会等到它完成执行,并发送contents
的当前值(未定义,因为此时getFile
尚未更改它)。
您需要将处理程序设置为异步并等待getFile
调用。
ipcMain.on('asynchronous-message', async (event, arg) => {
await getFile()
mainWindow.webContents.send('asynchronous-message',contents)
mainWindow.openDevTools();
})
或者更好的是,通过直接在处理程序中处理getFile
所做的事情来摆脱全局变量(使用非阻塞fs
函数也更好):
ipcMain.on('asynchronous-message', async (event, arg) => {
const {filePaths} = await dialog.showOpenDialog({properties:['openFile']});
const contents = await fs.promises.readFile(filePaths[0], 'utf-8');
mainWindow.webContents.send('asynchronous-message', contents);
mainWindow.openDevTools();
})