【发布时间】:2017-03-14 09:06:30
【问题描述】:
我正在构建一个电子应用程序,其中 mainWindow 对象是在快速启动之后创建的:http://electron.atom.io/docs/tutorial/quick-start/。
按照此快速入门,它是异步创建的。我遇到的问题是,例如,当我想将消息从主进程发送到渲染器进程时,我需要引用 mainWindow 对象。如果这恰好在我需要的模块中,那么我需要一种方法来让这个模块知道mainWindow 对象。
我当然可以在前面加上global.,但我知道这是非常不建议的。所以我希望做得更优雅。
我看到了这个帖子:Asynchronous nodejs module exports;这似乎提供了一个解决方案。从快速入门中获取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 的应用程序。如果我直接在main() 的回调中要求lib.js 也是这种情况(我知道也建议不要这样做)。
我承认我不完全理解帖子的简单案例,因为我对 node.js 比较陌生。这使我无法修复自己的实现,我同意这是生硬的复制/粘贴,合理地预期会失败。有人可以帮助我纠正上述方法,或者建议我采用不同的方法来使其工作吗?谢谢!
【问题讨论】: