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