具有初始化callback的全局variables

我使用了一个第三方模块( 一个拼写检查器 ),它有一个很长的初始化过程,并在初始化完成后调用一个callback函数。

我需要在我的应用程序的几个不同的文件(子模块)中使用这个模块。

在每个子模块中初始化一个不同的拼写检查器看起来像浪费时间和空间,所以我正在寻找一种方法来初始化一个拼写检查器,并将其用于所有模块。

我想到的一个select是将拼写检查器实例放在子模块中,在子模块中初始化,并从其他子模块中获取子模块。 但是,我不知道如何处理初始化callback – 我怎样才能确保我的其他子模块在初始化之前不会使用拼写检查器实例?

我想到的另一个select是创build一个单独的应用程序,与拼写检查器,并从我的应用程序通过TCP / IP或其他机制联系。 但是这也看起来很浪费 – 太多的通信开销。

有没有更好的办法?

这与使用数据库驱动程序库并等待它在发出查询之前成功连接到数据库类似。 最stream行的模式似乎是asynchronous库发出一个事件,如“连接”和调用代码,直到事件触发,才开始与库交互。 另一种select是按照mongoose和队列弯曲调用的例子,直到拼写检查器被初始化,然后开始提交它们进行处理。

所以简而言之,我会将拼写检查包装在一个直接导出拼写检查器的小型库中,而且当底层拼写检查器库调用初始化callback函数时也会发出“准备好”事件。 应用程序中应该可以共享这个包装器模块的实例。

创build你自己的模块, checker.js ,在哪里

 var spellChecker = require('wordsworth').getInstance(); var initialized = false; module.exports = function (callback) { if (!initialized) { return spellChecker.initialize(/* data */, function () { initialized = true; callback (spellChecker); } } callback (spellChecker); } 

client.js

 var checker = require('./checker); checker(function (spellChecker) { // use it.. }); 

所以,它会在首次调用时被初始化,剩下的客户端将会使用初始化版本。