0

Electronでは、主なプロセスでBrowserWindowを開きます。 BrowserWindowは1つのhtmlページをロードし、同じウィンドウは最終的に別のhtmlページをロードします。 main.jsが2ページ(login.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' 

削除されますか?ドキュメントは、レンダラープロセスがグローバル変数を逆参照する場合、変数はgcされると言います。これをテストしようとすると一貫性のない結果が得られ、Iよりも賢明な説明が欲しいです。

答えて

1

testGlobalはサイトが変更されるためガベージコレクトされます。 は削除されませんが、remote.getGlobal()mainStateのコピーを提供するだけで、参照はできませんので、testGlobal.settings = 'test value'に電話すると変更されません。

ipcMainipcRendererを使用して、グローバル変数を自分で同期することをお勧めします。

+0

有益な回答ありがとうございます。私はあなたのアイデアを使い始めましたが、変数の同期化に関しては問題があります。今私は、変数を変更するためにレンダラーからメインにメッセージを送信すると、レンダラーの次の行が実行されるまでに変数が変更されないことに気付きました。どのようにして2つを同期させて、一貫性のある値にすることができます –

+0

これはjavascriptで非同期関数が機能する方法です。あなたは 'ipcRenderer.sendSync'を使うことができますが、これはあなたのレンダラを完全にブロックします。 – RoyalBingBong

関連する問題