我想构建一个 Electron 应用程序,其中多个窗口将从 URL 池中加载 URL,并使用 ipcRender 发回信息。
我的设计看起来像这样:
main.js:
function foo(){
var urls = [ urls ....]
for(var i = 0; i < 3; i++){
var window = new BrowserWindow({
webPreferences: {
preload: "preload.js"
}
})
window.webContents.on("did-finish-load"), function(){
window.webcontents.executeJavascript("helloWorld()")
console.log(i)
}
// Omitted some checks
window.load(urls.shift())
}
ipc.on('helloworld', function(event, data){
console.log(data)
if (urls.length >= 1){
event.returnValue = urls.shift();
} else {
event.returnValue = 'done'
}
})
}
app.on('ready', foo)
预加载.js
helloWorld = function(){
var result = ipc.sendSync('helloWorld', 'hey there')
if (result != done){
window.location = result;
}
}
输出: 2嘿那里 2嘿那里 2嘿那里 ....
当前的代码有点工作:一旦页面完成加载并执行 helloWorld 函数,它就会继续加载 url,并且我能够从 ipcMain 获取数据。
但是,只有三分之一的窗口正在执行此操作,而不是我期望的 3 个窗口异步工作。另外 2 个窗口仅加载第一个网站,不执行任何其他操作。
为什么会发生这种情况?实现这种情况的正确方法应该是什么?
谢谢!
最佳答案
window
的值回调函数中的变量 did-finish-load
不包含您所想的内容:它始终指向最后创建的 BrowserWindow 实例。
由于您使用的是 Electron,您应该能够通过声明 window
轻松解决此问题与 let
而不是var
.
关于javascript - Electron 多窗口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739859/