Electron -主进程没有等待showOpendialog返回文件内容



我有以下的通信

//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();
})

最新更新