2

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

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

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

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

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

有没有更好的办法?

4

2 回答 2

2

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

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

于 2013-08-23T06:58:38.397 回答
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);
}

客户端.js

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

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

于 2013-08-23T08:36:53.343 回答