Node.js重载模块bug
Node.js reloading module bug
我用这种方式重新加载一个模块:
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
被调用,但最后一个没有关闭。
是否有任何方法可以了解每个模块的(长)运行函数,以便我可以在再次需要之前停止它们?或者有什么建议吗?
我打开任何疯狂的想法。
这只是一个大胆的猜测,但您可能能够在域中加载模块。
当您完成时,使用domain.dispose()来清除计时器:
dispose方法销毁域,并尽最大努力尝试清理与域关联的所有IO。流被中止、结束、关闭和/或销毁。定时器被清除。不再调用显式绑定的回调。任何错误事件被忽略。
我将简单地为间隔设置一个引用,并公开一个方法,以便像这样停止它:
var interval = setInterval(function () {
console.log('hello');
}, 1000);
var clearInt = clearInterval(interval);
我不认为你可以挂钩到任何事件,因为你只是删除一个引用。如果它不存在了,它会重新加载。在此之前,请调用clearInt函数。
您可以在主应用程序中创建一个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
中。
相关文章:
- Javascript,访问一个主要对象模块模式中的每个对象
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 如何从模块链中调用函数.导出到节点中
- 尽管链接成功并已成功下载,但未找到NPM模块
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 从模块内部访问Express装载路径
- RequireJS向模块传递配置总是返回undefined
- Node.js正在更改应用程序以使用集群模块
- 在Meteor项目中安装并包含npm模块后出错
- 模块模式和这个
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- 找不到模块捆绑包
- JavaScript命名约定;静态“;类或模块
- 显示模块模式在Knockout中设置模型的新实例
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- Javascript模块系统I'I’我正在努力,但搞不明白
- 如何捆绑循环相关模块
- 如何捆绑commonjs模块,除非指定需要
- Node.js重载模块bug
- Jquery缩放和旋转购物模块的bug