gpt4 book ai didi

javascript - 如何解决 win.loadFile() 和 app.on ('browser-window-created' ) 事件上的 Promise 解析之间的竞争条件

转载 作者:行者123 更新时间:2023-12-02 23:43:38 25 4
gpt4 key购买 nike

我正在开发一个 Electron 应用程序,其中一个模块创建一个 BrowserWindow,其他模块(所有模块都在主进程中)可以在它创建后访问该窗口。已完全加载(包括同时关闭窗口的情况)。

我正在 macOS 上使用 Electron 5.0.0。

这是迄今为止我所想出的简化版本:

// module mainWindow.js

const { BrowserWindow } = require('electron')
let ready = null

const 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 module

const win = require('mainWindow.js')
win.get(true).then((win) => { /* ... */ })


// yet another module

const { 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() 应该返回一个 Unresolved Promise(然后将其存储在 ready 中)异步创建之前 window 。但我的控制台显示:

get
not ready
creating
creating window
app.browser-window-created
get
not ready
rejecting
window id 1
there is no window
window.load resolved

有什么办法可以解决这个问题吗?

最佳答案

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

  return new Promise((resolve, reject) => {
setTimeout(() => {
//...
});
});

您还可以在分配给 get 内的 ready 时使用另一个 Promise 来推迟:

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

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

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

// create window ...
// somewhen ...
resolve(win);

关于javascript - 如何解决 win.loadFile() 和 app.on ('browser-window-created' ) 事件上的 Promise 解析之间的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55954117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com