我正在尝试编写一个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
事件。
我做错了什么?
答案 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);
});
}