1.前言

前面解决了ononce的监听问题,在反复测试下没有出现其他操作时调用注销的callback函数,问题算是解决了。考虑到以后可能扩展应用,还需要再深入研究一下怎么做才能更优雅的处理ononce事件,以及事件的监听怎么和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-quitwill-quit中调用event.preventDefault()或者在windowclose事件回调函数中阻止窗口关闭,都可以使程序退出失败。也就是说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");
  }
});
Logo

前往低代码交流专区

更多推荐