详解nodejs 文本操作模块-fs模块(五)

2020-06-17 07:13:29易采站长站整理

//用于接下来的,玩意又对该文件再次添加watchFile时,使用
stat = statWatchers[filename] = new StatWatcher();
//并且,对实例执行start的方法,应该是启动该实例不
stat.start(filename, options.persistent, options.interval);
}

//对该实例,监听change事件,并设置回调函数
stat.addListener('change', listener);

return stat;
};

注:在前面的源码解释中,出现了几个概念,我认为是有必要在这里补充一下的,因为如果对这几个概念的了解不深刻,那么久可能不理解为什么会这么写,或者意识不到,必须这么写才能保证代码正确的执行的。

1:只继承实例内部属性和方法,涉及代码:EventEmitter.call(this);

2:原型链的断链概念,涉及代码:util.inherits(StatWatcher, EventEmitter);

上述两个概念的一些相关内容,请参考:对象继承的方法小结,原型链断链的原因,浅析赋值表达式–JS基础核心之一。

3:nodejs中的event模块,也就是EventEmitter构造函数的相关信息:nodejs核心模块–events。

4:util模块,也就是util.inherits所在的模块,nodejs核心模块–util。
关于watchFile的源码,到这也就结束了,接下来,看unwatchFile的方法,用于解除对某个文件的监听。

fs.unwatchFile方法

该方法是用于解除一个文件的监听事件,其使用方法为


fs.unwatchFile(filename,[listener]);

其中:

1:filename:必须,需要被监听的文件的完整路径以及文件名

3:listener:可选,被监听文件发生改变时调用的回调函数

回调函数传入两个参数callback(curr,prev),它们都是fs.Stats的实例,关于该实例的详细介绍,请参考前篇文章,curr表示修改之后的的信息对象,prev表示本次修改之前的信息对象。

这里不在给出示例了,其实unwatchFile就相当于我们常用的off事件(jQuery),所以,这里也有个相同的问题,那就是,如果您不指定listenter的话,那么会把之前绑定的所有的watchFile的回调函数,都去除掉的,再者,匿名函数,是无法单独解除绑定的,所以请注意。

fs.unwatchFile源码

unwatchFile的实现原理是比较简单的,所以,这里就不过多的说明,细节部分,请查看源码中的注释。


fs.unwatchFile = function(filename, listener) {
//判断filename是否合法,不合法,则抛出异常
nullCheck(filename);

// 把filename转换成绝对地址
filename = pathModule.resolve(filename);

// 判断需要解除绑定文件,是否有缓存StatWatchers的实例,
// 如果没有,则表示,没有绑定过监听事件,则不需要去解除绑定
if (!inStatWatchers(filename)) return;