我正在以这种方式重装模块:
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
,但最后一个未被关闭。
有没有办法知道每个模块的(长)运行功能,所以我可以在我再次需要之前停止它们?或者任何建议我如何才能使这项工作?
我对任何疯狂的想法持开放态度。
答案 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
。