0

在Electron中,我有我的主要过程打开BrowserWindow。 BrowserWindow加载一个html页面,然后同一个窗口最终加载另一个html页面。如果渲染器进程关闭,收集电子全局变量垃圾?

main.js

var mainWindow; 
global.mainState = { 
    settings: {} 
} 
mainWindow = createWindow('main', { 
    width: 1000, 
    height: 800, 
}); 
if (curState == 'load') { 
    mainWindow.loadURL(`file://${__dirname}/interface/load.html`, {}) 
} 
if (curState == 'login') { 
    mainWindow.loadURL(`file://${__dirname}/interface/login.html`, {}) 
} 

load.html

const remote = require('electron').remote; 
var testGlobal = remote.getGlobal('mainState') 
testGlobal.settings = 'test value' 
testGlobal.settings.inner = 'test value2' 

当main.js加载第二页(login.html的),将全局变量被删除/取消引用?文档说,如果渲染器进程取消引用全局变量,那么该变量将被gc'd。当我尝试测试这个时,我得到了不一致的结果,我只是想从比我更明智的人那得到一些解释。

回答

1

testGlobal将被垃圾收集,因为网站发生变化。 global.mainState不会被删除,但是当您拨打testGlobal.settings = 'test value'时它也不会改变,因为remote.getGlobal()只是给你一份mainState而不是一个参考。

我建议你用ipcMainipcRenderer自己同步全局变量。

+0

谢谢你的有用答案。我开始使用您的想法,但在同步变量时遇到麻烦。现在我注意到,如果我从renderer发送消息到main来更改变量,那么在执行渲染器中的下一行时,变量不会更改。我如何同步这两个值,使值一致 –

+0

这就是javascript中异步函数的工作方式。你可以使用'ipcRenderer.sendSync',但那会完全阻止你的渲染器。 – RoyalBingBong