带有初始化回调的全局变量



我使用第三方模块(拼写检查器),该模块的初始化过程很长,初始化完成后会调用回调。

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

在每个子模块中初始化不同的拼写检查器似乎是浪费时间和空间,所以我正在寻找一种方法来初始化单个拼写检查器并在所有模块中使用它。

我想到的一个选项是将拼写检查器实例放在子模块中,在子模块中将其初始化,并从我的其他子模块中要求该子模块。但是,我不知道如何处理初始化回调——我如何确保我的其他子模块在初始化之前不会使用拼写检查器实例?

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

有更好的方法吗?

这类似于使用数据库驱动程序库,并在发出查询之前等待它成功连接到数据库。最普遍的模式似乎是异步库发出诸如"connected"之类的事件,并且调用代码在该事件触发之前不开始与库交互。另一种选择是以猫鼬和队列弯曲调用为例,直到拼写检查器初始化,然后开始提交它们进行处理。

简而言之,我会将拼写检查封装在一个小库中,该库直接导出拼写检查程序,但当底层拼写检查程序库调用初始化回调时,也会发出一个"就绪"事件。应该可以在整个应用程序中共享包装器模块的相同实例。

创建自己的模块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..
});

因此,它将在第一次调用时初始化,其余客户端将使用初始化版本。

最新更新