Я создаю электронное приложение, в котором объект mainWindow
создается после быстрого старта: http://electron.atom.io/docs/tutorial/quick-start/.
Согласно этому быстрому запуску, он создается асинхронно. Проблема, с которой я сталкиваюсь, заключается в том, что, например, когда я хочу отправить сообщения из основного процесса в процесс рендеринга, мне нужно сослаться на объект mainWindow
. Если это произойдет в модуле, который мне нужен, то мне нужно средство, чтобы этот модуль знал об объекте mainWindow
.
Я мог бы, конечно, добавить к нему global.
, но я знаю, что это очень не рекомендуется. Поэтому я хочу сделать это более элегантно.
Я наткнулся на этот пост: Асинхронный экспорт модуля nodejs; который, кажется, предлагает решение. Взяв файл main.js
из быстрого запуска (см. ссылку выше, там это явно показано), кажется, я бы добавил в функцию createWindow
if( typeof callback === 'function' ){
callback(mainWindow);
}
и экспортируйте модуль main.js
как
module.exports = function(cb){
if(typeof mainWindow !== 'undefined'){
cb(mainWindow);
} else {
callback = cb;
}
}
Затем в сценарии более высокого уровня мне потребуется следующее:
let main = require('./main.js');
let lib = require('./lib.js'); // Library where I need a mainWindow reference
main(function(window) {
lib.doSomething(window);
});
где lib.js
выглядит
module.exports.doSomething = function(window) {
// Do something with window object, like sending ipc messages to it
window.webContents.send('hello-from-main', "hi!");
}
Хотя простой случай в исходном сообщении «Асинхронный экспорт модуля nodejs» работает нормально, я не могу заставить его работать, как описано выше; при запуске приложения оно жалуется Uncaught Exception: TypeError: Cannot read property 'webContents' of null
. Это также имеет место, если я напрямую требую lib.js
в обратном вызове main()
(что, как я знаю, также не рекомендуется).
Признаюсь, я не совсем понимаю простой случай поста, так как я новичок в узле. Это не позволяет мне исправить мою собственную реализацию, что, я согласен, является тупым копированием/вставкой, которое, как разумно ожидать, потерпит неудачу. Может ли кто-нибудь помочь мне с тем, как исправить описанный выше метод, или посоветовать мне другой подход, чтобы заставить его работать? Благодарю вас!