javascript - Electron 多窗口通信

标签 javascript electron

我想构建一个 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 实例。

Why? Scope.

由于您使用的是 Electron,您应该能够通过声明 window 轻松解决此问题与 let而不是var .

关于javascript - Electron 多窗口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739859/

相关文章:

javascript - 嵌入式 Youtube 视频自动播放 - 在图像幻灯片中间

javascript - electron 的 globalShortcut 将禁用原始按键

electron - 如何使用preload.js将ipcRenderer.invoke处理程序答案传递给 Electron 渲染器进程

javascript - 如何在 jQuery 中的同一事件上绑定(bind)多个 ID?

javascript - 带有嵌入式 Bootstrap 开关的传单 map

node.js - Electron 应用程序中的事件发射器内存泄漏

node.js - 如何用NodeJs/Electron抓取计算机名?

reactjs - 如何在项目根目录之外访问静态文件?

javascript - 使用较短的数据库查询代码将数据插入 MySQL 数据库表

javascript - 调整窗口大小时限制居中div的水平范围