0

我正在以这种方式重新加载模块:

require('./module.js');             // require the module
delete require.cache('/module.js'); // delete module from cache
require('/module.js');              // re-require the module

但是如果模块包含这样的东西就会出现问题:

setInterval(function(){ 
    console.log('hello!'); 
}, 1000);

每次我重新加载模块时setInterval都会调用一个新模块,但最后一个模块没有关闭。

有什么方法可以了解每个模块的(长时间)运行功能,以便我可以在再次需要之前停止它们?或者有什么建议我怎样才能完成这项工作?

我对任何疯狂的想法持开放态度。

4

3 回答 3

4

这只是一个疯狂的猜测,但您可能能够在域中加载模块。

完成后使用 domain.dispose() 清除计时器:

dispose 方法销毁一个域,并尽最大努力清理与该域关联的所有 IO。流被中止、结束、关闭和/或销毁。计时器被清除。 不再调用显式绑定的回调。因此引发的任何错误事件都将被忽略。

于 2013-03-25T09:31:38.380 回答
0

我只需设置对间隔的引用并公开一个方法以停止它,如下所示:

var interval = setInterval(function () {
    console.log('hello');
}, 1000);

var clearInt = clearInterval(interval);

我不认为你可以挂钩任何事件,因为你只是删除一个引用。如果它不再存在,它会重新加载。在执行此操作之前,请调用 clearInt 函数。

于 2013-03-25T07:35:20.163 回答
0

IntervalRegistry您可以在主应用程序中 创建一个:

global.IntervalRegistry = {
    intervals : {},
    register  : function(module, id) {
      if (! this.intervals[module])
      {
        this.intervals[module] = [];
      }
      this.intervals[module].push(id);
    },
    clean     : function(module) {
      for (var i in this.intervals[module])
      {
        var id = this.intervals[module][i];
        clearInterval(id);
      }
      delete this.intervals[module];
    }
  };

在您的模块中,您将注册在那里创建的间隔:

// module.js
IntervalRegistry.register(__filename, setInterval(function() {
  console.log('hello!');
}, 1000));

当需要清理时,调用这个:

var modulename = '/full/path/to/module.js'; // !!! see below
IntervalRegistry.clean(modulename);
delete require.cache[modulename];

请记住,模块以其完整文件名存储在require.cache.

于 2013-03-25T07:39:52.053 回答