Node.js重装模块bug

时间:2013-03-25 07:23:52

标签: javascript node.js require long-running-processes

我正在以这种方式重装模块:

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,但最后一个未被关闭。

有没有办法知道每个模块的(长)运行功能,所以我可以在我再次需要之前停止它们?或者任何建议我如何才能使这项工作?

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

3 个答案:

答案 0 :(得分:4)

这只是一个疯狂的猜测,但您可以在domain内加载模块。

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

  

dispose方法破坏域,并尽力尝试   清理与域关联的任何和所有IO。流   中止,结束,关闭和/或销毁。 计时器被清除。   不再调用显式绑定的回调。任何错误事件   由于这被忽略而被提出。

答案 1 :(得分:0)

我只是设置一个对间隔的引用并公开一个方法,以便像以下一样停止它:

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

var clearInt = clearInterval(interval);

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

答案 2 :(得分: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