为了账号安全,请及时绑定邮箱和手机立即绑定

如何解决Win.loadFile()和app.on('browser-window-created'

如何解决Win.loadFile()和app.on('browser-window-created'

慕沐林林 2021-04-30 18:27:02
我正在开发一个Electron应用程序,其中一个模块创建一个,BrowserWindow而其他模块(在主进程中所有这些模块)在完全加载后都可以访问该窗口(包括在此期间窗口已关闭的情况)。我正在macOS上使用Electron 5.0.0。到目前为止,这是我所提出的内容的简化版本:// module mainWindow.jsconst { BrowserWindow } = require('electron')let ready = nullconst createWindow = () => {  console.log('creating window')    return new Promise((resolve) => {      let win = new BrowserWindow({      show: false,    })    win.on('closed', () => {      ready = null    })    win.loadFile('renderer.html').then(() => {      win.show()      resolve(win)      console.log('window.load resolved')        })    console.log('window id', win.id)        }const get = (create) => {  console.log('get')  if (ready) {    console.log('ready')    return ready  } else {    console.log('not ready')    if (create) {      console.log('creating')      ready = createWindow()      return ready    } else {      console.log('rejecting')      return Promise.reject()    }  }}exports.get = get// some other moduleconst win = require('mainWindow.js')win.get(true).then((win) => { /* ... */ })// yet another moduleconst { app } = require('electron')const win = require('mainWindow.js')app.on('browser-window-created', () => {  console.log('app.browser-window-created')  win.get(false).then((win) => {    log('got it')    // ...  }, () => {    log('there is no window')  })})我的看法是,在异步创建窗口之前,createWindow()应返回一个未解决的Promise(然后将其存储在中ready)。但是我的控制台显示:getnot readycreatingcreating windowapp.browser-window-createdgetnot readyrejectingwindow id 1there is no windowwindow.load resolved有没有什么办法解决这一问题?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

问题似乎是该事件是同步触发的,因此它在函数完成执行之前运行,并且ready =尚未运行。要解决此问题,您必须推迟窗口的创建:


  return new Promise((resolve, reject) => {

   setTimeout(() => {

     //...

   });

  });

您还可以在分配给readyinside时使用另一个promise来推迟get:


  ready = Promise.resolve().then(createWindow);

另外,您可以ready在创建窗口之前重新分配,因为您必须resolve从回调中公开该窗口:


  let resolve;

  ready = new Promise(it => resolve = it);


  // create window ...

  // somewhen ...

  resolve(win);


查看完整回答
反对 回复 2021-05-20
?
HUWWW

TA贡献1874条经验 获得超12个赞

您的问题是 let win = new BrowserWindow立即触发'browser-window-created'事件,因此在其回调中您找不到任何待处理的Promise。


因此,我建议您重组代码。


例如app.on('browser-window-created')可以用来获取创建的BrowserWindow。将监听器添加到'did-finish-load'BrowserWindow的webContents中,您将获得与返回的Promise完全相同的回调(loadFile会为该事件解析)


app.on('browser-window-created', (event, window) => {

  console.log('app.browser-window-created')

  window.webContents.on('did-finish-load', () => {

    console.log('got it')

    // ...

  })

  window.webContents.on('did-fail-load', () => {

    console.log('there is no window')

  })

})


查看完整回答
反对 回复 2021-05-20
  • 2 回答
  • 0 关注
  • 751 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号