};
this._handle.onstop = function() {
self.emit('stop');
};
}
// 把EventEmitter原型链的属性和方法,扩展到StatWatcher对象的原型链中
// 更确切的说明就是,StatWatcher.prototype = EventEmitter.prototype;
util.inherits(StatWatcher, EventEmitter);
// 在StatWatcher重新定义来原型链之后,再执行其他的扩展,以防止原型链断链的情况
StatWatcher.prototype.start = function(filename, persistent, interval) {
nullCheck(filename);
this._handle.start(pathModule._makeLong(filename), persistent, interval);
};
StatWatcher.prototype.stop = function() {
this._handle.stop();
};
//缓存Watcher的一个对象
var statWatchers = {};
function inStatWatchers(filename) {
//判断filename是否在statWatchers中,如果是则返回缓存的实例
return Object.prototype.hasOwnProperty.call(statWatchers, filename) &&
statWatchers[filename];
}
fs.watchFile = function(filename) {
//判断fileName是否合法
//如果不合法,则抛出一个异常然后停止执行
nullCheck(filename);
//调用path模块的方法,返回文件的绝对路径
filename = pathModule.resolve(filename);
var stat;
var listener;
//默认的配置信息,这里也说明来下,为何监听间隔为5007ms,
//只是,我表示,我是没有看懂下面的英文注释要说啥的
var options = {
// Poll interval in milliseconds. 5007 is what libev used to use. It's
// a little on the slow side but let's stick with it for now to keep
// behavioral changes to a minimum.
interval: 5007,
persistent: true
};
//对参数进行判断,判断是否有自定义的option,如果有,使用自定义的
//没有定义的,使用默认值
//回调函数赋值
if (util.isObject(arguments[1])) {
options = util._extend(options, arguments[1]);
listener = arguments[2];
} else {
listener = arguments[1];
}
//回调函数是必须的,如果没有回调函数,则直接抛出一个异常,并停止运行
if (!listener) {
throw new Error('watchFile requires a listener function');
}
//看完上面的inStatWatchers的源码之后,觉得这里是否可以再次优化一次?
//stat =inStatWatchers(filename);
//if(!stat){
//stat = statWatchers[filename] = new StatWatcher();
//stat.start(filename,options.persistent,options.interval);
//}
//这样的话,就可以节省一次对象的查找和取值了
//判断该文件,是否已经创建了StatWatcher实例
if (inStatWatchers(filename)) {
//如果之前已经创建过了,则使用之前创建过的StatWatcher实例
stat = statWatchers[filename];
} else {
//如果没有,则 重新创建一个,并把创建的示例,保存下来









