1.前言
前面解决了on
和once
的监听问题,在反复测试下没有出现其他操作时调用注销的callback
函数,问题算是解决了。考虑到以后可能扩展应用,还需要再深入研究一下怎么做才能更优雅的处理on
和once
事件,以及事件的监听怎么和Electron-vue
框架更好的融合,这里不再赘述,等以后有结果了,再补上后续。
这里想要说的一个问题就是当退出程序时,会将进程直接杀死,窗口直接关闭。因为后台更新用户状态,需要在退出程序的时候去先执行注销操作,即先访问后台,将当前用户注销掉,清除token
或者session
。在反复测试登陆,注销,修改密码,退出时,出现了setSize
未定义的情况。
因为之前使用的是mainWindow.destroy
,发现会出现上面的setSize
的问题,可能是执行窗口销毁操作时,程序并未完全退出,导致在setSize
的时候出现未定义的情况,这时就不能直接执行mainWindow.destroy
,我们需要执行程序的退出操作。
2.程序退出
2.1 默认退出
- 如果没有监听
window-all-closed
事件并且所有窗口都关闭了,默认的行为是退出程序 - 如果监听了
window-all-closed
事件,那么在你的所有窗口都关闭时会去执行
2.2 quit退出
当开发者调用了 app.quit()
,如果此时所有窗口已经关闭,直接触发quit事件;否则Electron 会首先触发before-quit
,然后开始关闭所有的窗口并且触发 will-quit
事件,在这种情况下 window-all-closed
事件不会被触发,所以你可以放心在window-all-closed
里使用app.quit()
,而不用担心会出现无限递归。
调用app.quit()
并不能保证程序一定会退出,在before-quit
,will-quit
中调用event.preventDefault()
或者在window
的close
事件回调函数中阻止窗口关闭,都可以使程序退出失败。也就是说quit
不是独裁者,更像是众议院,老大提出退出操作,然后众人商量,退出的愿望可能被否决。
2.2 exit退出
既然有app.quit
这种温和的退出方式,那么也会有更加粗暴的退出方案,那就是app.exit
。
与quit
这种民主相比,exit
更像是独裁者,他会直接执行退出操作,不跟任何人商量,只要保证你的程序中的逻辑合理,是完全可以拿来使用的。比如在退出的时候,需要先注销一下用户,那么你可以在注销请求返回结果并且操作成功的时候执行exit
操作就行了。
// 主进程中
// 退出函数
function exitExe() {
child.stdin.write('{"type":"logout"}\n')
child.stdout.on('data', (data) => {
mainWindow.webContents.send('logout-exit', returnString(data))
})
}
// 退出程序,销毁窗口
ipcMain.on('destroy',()=>{
app.exit()
})
//渲染进程中
this.$electron.ipcRenderer.once("logout-exit", (event, arg) => {
let result = JSON.parse(arg);
if (result.type === "0") {
this.$electron.ipcRenderer.send("destroy");
}
});