从主过程创建不可见窗口以计算Electron中的函数

时间:2017-09-11 06:49:03

标签: javascript electron

我正在尝试编写一个Electron程序,其中主进程创建一个不可见的窗口,向该窗口发送一个数字,窗口计算析因,然后将其发回。

这是主要过程:

function invisibleWindow() {
  const invisPath = 'file://' + path.join(__dirname, 'files/html/inv.html')

  let win = new BrowserWindow({ width: 400, height: 400, show: false })
  win.loadURL(invisPath)

  win.webContents.on('did-finish-load', function () {
    const input = 100;
    win.webContents.send('compute-factorial', input);
  })



  ipcMain.on('factorial-computed', function (event, input, output) {
    const message = `The factorial of ${input} is ${output}`
    console.log(message);
  })
}

该函数在主进程中通过以下方式调用:

app.on('ready', () => {
  // creates different window here

  invisibleWindow();
});

这是inv.html文件:

<html>
  <script type="text/javascript">
    const ipc = require('electron').ipcRenderer
    const BrowserWindow = require('electron').remote.BrowserWindow

    ipc.on('compute-factorial', function (event, number) {
      const result = factorial(number)

      ipcRenderer.send('factorial-computed', number, result)
      window.close()
    })

    function factorial (num) {
      if (num === 0) return 1
      return num * factorial(num - 1)
    }
  </script>
</html>

现在我已经将它添加到我的程序中,每次当我通过终端启动它时,即使所有其他(可见)窗口都关闭,它也不会自行终止。我想这是因为看不见的窗口仍然打开,因为它没有收到compute-factorial事件。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是因为race condition。 电子文档:

  

活动:&#39;完成加载&#39;

     

导航完成后发出,即标签的微调器有   停止旋转,并调度了onload事件。

您可以使用setTimeout

进行尝试
win.webContents.on('did-finish-load', function () {
  setTimeout(() => {
    const input = 100;
    win.webContents.send('compute-factorial', input);
  }, 3000);
});

主进程不知道DOM何时就绪。 你可以做这样的事情。

发送您的主要流程&#34; dom-ready-ready&#34;事件

<强> inv.html

ipc.send('dom-is-ready');

&#39; did-finish-load&#39; 代码粘贴到&#39; dom-is-ready&#39;

<强> main.js

function invisibleWindow() {
  const invisPath = 'file://' + path.join(__dirname, 'files/html/inv.html');

  const win = new BrowserWindow({ 
    width: 400, 
    height: 400, 
    show: false 
  });

  win.loadURL(invisPath);

  win.webContents.on('did-finish-load', function () {
    win.show();
  });

  ipcMain.on('dom-is-ready', function (event) {
    const input = 100;
    win.webContents.send('compute-factorial', input);
  });

  ipcMain.on('factorial-computed', function (event, input, output) {
    const message = `The factorial of ${input} is ${output}`
    console.log(message);
  });
}