电子应用程序:在另一个模块中引用mainWindow对象?

我正在构build一个电子应用程序,其中mainWindow对象是在快速启动之后创build的: http : //electron.atom.io/docs/tutorial/quick-start/ 。

按照这个快速入门,它是asynchronous创build的。 我遇到的问题是,例如,当我想要从主发送消息到渲染器进程,我需要引用mainWindow对象。 如果这发生在我需要的模块中,那么我需要一种方法让这个模块知道mainWindow对象。

我当然可以在global.预测global. 但是我知道这是非常不利的。 所以我希望更优雅地做。

我碰到这个post: asynchronousnodejs模块导出 ; 似乎提供了一个解决scheme。 从快速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!"); } 

虽然在原来的'asynchronousnodejs模块出口'的简单情况下工作正常,我不能像上面描述的那样工作; 运行应用程序,它抱怨Uncaught Exception: TypeError: Cannot read property 'webContents' of null 。 如果我直接要求在main()的callbacklib.js ,我也知道这也是一种情况。

我承认,我并不完全理解这个post的简单例子,因为我对节点相当陌生。 这阻止了我自己修复它的实现,我同意这是合理地预期会失败的钝拷贝/粘贴。 有人能帮助我如何纠正上述方法,或build议我一个不同的方法,使其工作? 谢谢!

Whooops! 魔鬼是在细节…我已经定义在main.js

 let mainWindow = null, callback; 

这导致了错误! 应该

 let mainWindow, callback; 

那么它完美的作品!

与其删除我的post,我select保留并回答自己,以供其他需要asynchronous导出的人员参考。