Я работаю над приложением Electron, где один модуль создает BrowserWindow
, а другие модули (все они в основном процессе) могут получить доступ к окну после того, как было полностью загружено (включая ситуациигде окно было закрыто в то же время).
Я работаю с Electron 5.0.0 на macOS.
Вот упрощенная версия того, что я придумал, поэтомуfar:
// 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()
должен возвращать неразрешенное обещание (которое затем сохраняется в ready
) до асинхронного создания окна.Но моя консоль гласит:
get
not ready
creating
creating window
app.browser-window-created
get
not ready
rejecting
window id 1
there is no window
window.load resolved
Есть ли способ исправить это?