使用app.quit()关闭电子应用程序中所有打开的窗口是不好的做法吗?

时间:2017-03-07 16:43:28

标签: node.js electron

我有一个带有NodeJS和Express的Electron应用程序。我有一个文件(app.js)中的主进程代码和另一个文件(router.js)中的路由。

主文件创建主窗口:

mainWindow = new BrowserWindow({width: 1280, height: 800, icon: iconPath});

每当您单击应用程序中的pdf文档链接时,路径文件都会创建一个新窗口:

 router.get('/docs/:module/:type/:file', function(req, res) {
  openPDF(req.params.module,req.params.type,req.params.file);
  res.end();
});

// open pdf's in a new window
let newWindow;
const openPDF = function(module,filetype,filename) {

  let file = 'file:///' + __dirname + '/app/docs/' + module + '/' + filetype + '/' + filename;

  let newWindow = new BrowserWindow({
    width: 800, 
    height: 600,
    icon: iconPath,
    webPreferences: {
      nodeIntegration: false
    }
  });

  newWindow.setMenu(null);
  // newWindow.webContents.openDevTools();

  const param = qs.stringify({file: file});

  newWindow.loadURL('file://' + __dirname + '/app/pdfjs/web/viewer.html?' + param);

  newWindow.on('closed', function() {
    newWindow = null;
  });
}

当我关闭主窗口时,我想要关闭任何其他打开的窗口。我一直很难尝试实现这个(两个窗口都在主要过程中,所以我不能根据我的知识使用IPC。)然后我意识到如果我调用app.quit()时主窗口关闭它关闭所有其他窗口:

// Emitted when the window is closed.
  mainWindow.on('closed', function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null
    // quitting the app on main window close will close any other open windows
    app.quit();
  })

我的问题是这是否是一件坏事。它会在没有任何用户输入的情况下终止所有打开的窗口,但是没有未保存的工作可能会丢失,因为所有新窗口都是无法编辑的pdf文件。

2 个答案:

答案 0 :(得分:1)

您应该考虑使用状态容器框架(如ReduxFlux)来管理结算。这样,当您收到用户的关闭信号时,您可以发送信号以确保:

  • 如果用户的数据未保存,则提示用户
  • 将应用的配置数据缓存到文件中,如果您愿意(在下次启动时从之前的状态恢复
  • 然后运行app.quit(),以确保安全退出

除此之外,如果您的应用不需要安全关闭,那么app.quit本身就是关闭电子应用的完美方式。

答案 1 :(得分:0)

一些事情:

首先,你说"两个窗口都在主要过程中,所以我不能尽我所能使用IPC。"实际上,这不是真的。使用BrowserWindow本身启动另一个进程。在您生成BrowserWindow时,在Electron生态系统(实际上是具有Electron shell UI和API附加组件的Node环境)中,您正在创建新的渲染过程,并且每个渲染过程都具有可用于主要和渲染进程以互相访问。

其次,您询问在mainWindow上app.quit()事件上使用'close'(" 我的问题是这是否是一件坏事。&#34)。正如您所说,只要您不担心清理窗口/进程中的任何数据,这样做就可以了。即使您必须清理某些内容,也可以在'close'事件函数中处理它。所以,不用担心,这不是一件坏事。