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

时间:2013-08-23 04:42:33

标签: node.js asynchronous

我使用具有较长初始化过程的第三方模块(a spell-checker),并在初始化完成后调用回调。

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

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

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

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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