预检清单
- 我已阅读了此项目的 Contributing Guidelines。
- 我同意遵循此项目遵循的 Code of Conduct。
- 我在问题跟踪器中搜索了一个与我想要提交的功能请求相匹配的问题,但没有成功。
问题描述
我有一些代码,它通过 window.open
创建一个窗口,然后立即告诉主进程打印它。问题是窗口还没有完成加载/渲染,所以它打印了一张空白页。
我真的不希望不得不为我创建的所有这些窗口添加一个 did-finish-load 或 ready-to-show 事件。
建议解决方案
我们能否为 BrowserWindows(或 webcontents?)添加一个 API,返回一个解析为窗口完成加载和渲染后的 promise?然后我们可以这样做:
const win = BrowserWindow.fromId(1);
await win.whenReady();
win.webContents.print(...);
(我想我们必须定义 whenReady
到底是什么意思。也许使用一切已经完成加载和渲染的广义定义)
5条答案
按热度按时间eoxn13cs1#
这对我来说非常有帮助。我有一个情况,就是在后台创建新的窗口,这样当用户需要它们时,我可以快速地显示它们(大型应用程序需要花费时间进行设置)。然而,在某些情况下,如果窗口关闭得太早,我就陷入了一种不知道窗口是否准备好显示的情况。如果我过早地
window.show()
,它没有获取到loadURL()
,而是卡在了最初加载的URL上。由于设置处理程序时 (如果事件已经发生),ready-to-show
事件不会触发,所以我陷入了困境。能够await
对于这种情况将会非常棒。rggaifut2#
实际上,如果
ready-to-show
总是触发,当窗口已经处于 "准备好显示" 的状态并且/或者已经显示时,可以立即解决这个问题。你可以使用 Promise 轻松实现这一点。ct2axkht3#
尽管我刚刚发现
loadURL()
返回了一个承诺。mepcadol4#
@mix3d 是的,
loadURL
通常用于处理这种情况,但在我的情况下,我不是将URL加载到窗口中的人。我只是调用window.open
,Electron正在加载URL,所以我没有方法可以钩入任何loadURL promise,不得不采用在ready-to-show
事件中解决你的方法。i2loujxw5#
这对于在某些测试运行器 Package 器(如playwrite)中创建窗口的测试也很有用。我有一个测试,旨在检查应用程序启动时是否创建了一个窗口,并且在准备好时变得可见。
但是,实际上是在子进程中启动了electron。进程之间的通信和评估命令需要时间。因此,事件很可能在我检查运行之前触发。出于这个原因,我有一个开销。
如果能有一个与
app
、browserWindow.isReady(): boolean
和browserWindow.whenReady(): Promise
相同的API就太好了。