electron 将whenReady API添加到BrowserWindows以等待它们的设置/渲染,

hrirmatl  于 4个月前  发布在  Electron
关注(0)|答案(5)|浏览(61)

预检清单

  • 我已阅读了此项目的 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 到底是什么意思。也许使用一切已经完成加载和渲染的广义定义)

eoxn13cs

eoxn13cs1#

这对我来说非常有帮助。我有一个情况,就是在后台创建新的窗口,这样当用户需要它们时,我可以快速地显示它们(大型应用程序需要花费时间进行设置)。然而,在某些情况下,如果窗口关闭得太早,我就陷入了一种不知道窗口是否准备好显示的情况。如果我过早地 window.show() ,它没有获取到 loadURL() ,而是卡在了最初加载的URL上。由于设置处理程序时 (如果事件已经发生), ready-to-show 事件不会触发,所以我陷入了困境。能够 await 对于这种情况将会非常棒。

rggaifut

rggaifut2#

实际上,如果 ready-to-show 总是触发,当窗口已经处于 "准备好显示" 的状态并且/或者已经显示时,可以立即解决这个问题。你可以使用 Promise 轻松实现这一点。

Promise.resolve().then(() => {
  // 在这里执行你的代码
});
ct2axkht

ct2axkht3#

尽管我刚刚发现 loadURL() 返回了一个承诺。

mepcadol

mepcadol4#

@mix3d 是的,loadURL 通常用于处理这种情况,但在我的情况下,我不是将URL加载到窗口中的人。我只是调用 window.open ,Electron正在加载URL,所以我没有方法可以钩入任何loadURL promise,不得不采用在 ready-to-show 事件中解决你的方法。

i2loujxw

i2loujxw5#

这对于在某些测试运行器 Package 器(如playwrite)中创建窗口的测试也很有用。我有一个测试,旨在检查应用程序启动时是否创建了一个窗口,并且在准备好时变得可见。

但是,实际上是在子进程中启动了electron。进程之间的通信和评估命令需要时间。因此,事件很可能在我检查运行之前触发。出于这个原因,我有一个开销。

const window = await electronApp.browserWindow(await electronApp.firstWindow());  // <-- await first created window
  const windowState = await window.evaluate(
    (mainWindow) => {

      return new Promise(resolve => {

        // No way to check did `ready-to-show` event already fired or not!
        mainWindow.once('ready-to-show', () => resolve(mainWindow.isVisible()));

        // If `ready-to-show` event hasn't fired within 10 seconds,
        // I'm just ASSUMING that it actually fired before
        setTimeout(
          () => resolve(mainWindow.isVisible()),
          10_000,
        );

      });
    },
  );

如果能有一个与appbrowserWindow.isReady(): booleanbrowserWindow.whenReady(): Promise相同的API就太好了。

相关问题