在Nodejs观测模型探讨

在Nodejs观测模型探讨
一、前言

一段时间的使用后Nodejs,回顾最近的API,使用新的功能,为了有一个更高的高度,总结了API的差异中国的英文版,会做更多的拓展自己的理解,希望对大家有帮助,首先从核心事件

Nodejs事件实现观察者模式,它支持Nodejs的核心机制,和HTTP / FS /单糖继承事件,可以添加监听事件。这种设计模式通常是在客户端组件编程思想的应用,我们有一个简单的模型的理解。

第一次接触是在ExtJS ext.util.observable源代码框架的观察者模式,然后就联系JS,这种感觉是很强烈的,设计模式是我最早接触,在Underscore.js代码后也看到,后者更简单和优雅的,我写的部分基本上是与思想一致。

观察者模式是添加一个监视事件的对象,如('show,回调),这是由对象本身符合要求时显示等。浏览器本身实现了DOM的监视机制。

如果我们把输入KeyUp监测,目的是输出其价值
$(输入的),('keyup功能()){
console.log(的价值);
});
当您输入此内容时,您将自己在日志中输出它的值。

但是我们做了一个组件,比如对话框,如何监视最常见的显示/隐藏事件

主要的方法是在实例化时直接配置回调,例如
var对话框=新对话框({
内容:这是弹出框的内容。
显示:函数(){
console.log('output本节比赛时的框架);
}
});
它可以被使用,但是它显然不够灵活,你怎么能在对话框输入的时候随时添加事件呢

两。观察者模式的实现

该事件的对象是第一次实施,其中底层和触发发射提供,和事件是叠加在JSON对象的_events形式
var事件{ {
函数(名称,回调){
这个_events =这_events | | { };
这个_events {名称=本。_events {姓名} } { } | |;
这_events {姓名},推(回调);
},
发出:函数(名称){
这个_events =这_events | | { };
var args = array.prototype.slice.call(参数1),
我=这个;
如果(这。_events {姓名}){
美元。每个(这_events {姓名},,函数(k,v){
V.call(我,args);
})
}
}
}
另一个函数用于复制对象的属性
函数扩展(源){
var args = array.prototype.slice.call(参数1);
对于(var i = 0,父;母=参数{我};i++){
对于(父中的var支持){
源{父} {父} };
}
}
}
实现对话框,

仅实现创建;方法:显示/隐藏;事件:显示/隐藏;

当您查看效果时,添加此样式
对话{。
位置:固定;
顶部:50%;
左:50%;
保证金:- 00 - 100px 50px;
宽度:200px;
身高:120px;
背景:# FFF;
边境:5px固体# afafaf;
}
执行元件
var对话框=函数(配置){
this.config =配置;
This.init(这个配置);
};
扩展属性
扩展(dialog.prototype,{

初始化:函数(配置){
This.render(config)
},

渲染:函数(配置){
this.el = $()。AddClass('dialog);
This.el.html(config。内容);
$('body)。追加(这,EL);
},

说明:函数(参数){
This.el.fadeIn();
This.emit('show,参数);
},

隐藏:函数(参数){
This.el.fadeOut();
This.emit('hide,参数);
}

}事件;

生成一个实例并添加三个显示和隐藏监视事件
VaR对话框= window.dialog =新的对话框({
内容:'dialog一
});

Dialog.on('show功能(TXT){
console.log('dialog显示一个+ TXT);
});

做某事

Dialog.on('show功能(TXT){
console.log('dialog显示两+ TXT);
});

做某事

Dialog.on('show功能(TXT){
console.log('dialog显示三+ TXT);
});

做某事

Dialog.on('hide功能(TXT){
console.log('dialog隐藏一个+ TXT);
});

做某事

Dialog.on('hide功能(TXT){
console.log('dialog隐藏两+ TXT);
});

做某事

Dialog.on('hide功能(TXT){
console.log('dialog隐藏三+ TXT);
});

我们添加了六个不同的显示事件和隐藏事件六次。

三相应的日志输出时dialog.show()执行。附加事件存储在_events对话框,如图。
三显示添加到输出是成功的,和事件存储在_events财产

Nodejs事件也是这一过程的实现。

三。结构
风险事件=需要('events);
console.log(事件);
*
从下面的数据,你可以看到事件点的eventemiter
{ { EventEmitter }功能:
EventEmitter:{圆},
usingdomains:{吸气/ setter },
defaultmaxlisteners:10,
init:{函数},
listenercount:{功能} }
* /

无功myemitter =新的事件();
console.log(myemitter);
*
{域:null,
_events:{ }, / /你可以看到自己的_events属性,添加监控事件放在这里
_maxlisteners:定义}
* /

console.log(myemitter。__proto__);
*
{域:未定义,
_events:未定义,
_maxlisteners:未定义,
setmaxlisteners:{功能:setmaxlisteners },
发射:{函数:释放},
AddListener:{功能:听听},
功能:听听:{ },
一次:{函数:},
RemoveListener:{功能:removelistener },
removealllisteners:{功能:removealllisteners },
侦听器:{函数:侦听器}
* /

MyEmitter.on('show功能(TXT){ console.log(一+ TXT)})
MyEmitter.on('show功能(TXT){ console.log('tow + TXT)})
MyEmitter.on('hide功能(TXT){ console.log(一+ TXT)})
MyEmitter.emit('show ','show);
(10)myemitter.setmaxlisteners;
console.log(myemitter);
*
{域:null,
_events:{显示:{ {功能},{功能} } } } {功能,隐藏: / /添加后的东西,储存在JSON形式
_maxlisteners:10 }
* /

四、API

它提供的方法,就听听的速记添加实例侦听事件,和其他的属性也被称为的名字
财产
_events:定义,在 / /栈存储在事件表
_maxlisteners: / /未设置最大监控数超出警告

----------------------------------------------------------------------------------------------------------------

方法
setmaxlisteners:{功能:setmaxlisteners },
/ *套_maxlisteners私人财产价值,事件将默认当某事件监测超过10警告时(以上事件。defaultmaxlisteners),为了防止内存泄漏,如
(节点)警告:可能的内存泄漏检测EventEmitter。添加11个显示监听器。使用emitter.setmaxlisteners()
但这是一个友好的提醒,您可以通过设置侦听器的最大数量来避免这个问题。
(20)myemitter.setmaxlisteners;
* /

发射:{函数:释放},
触发监视器事件
Emitter.emit(事件,{ } { } arg1,arg2,…)
如myemitter.on('show ','prompt内容);
参数1是事件名称,参数是回调中参数的两个参数。
* /

AddListener:{功能:听听},
*
添加侦听器事件
Emitter.addListener(事件监听器);
如myemitter.addlistener('show功能(TXT){ console.log(TXT)});
参数一个是事件名称,和两参数是相应的回调,在回调的参数是arguments.prototype.slice.call(1)在发出;
* /

功能:听听:{ },
*
这是听听速记
* /

一次:{函数:},
*
它继续工作,但发射失败一次。
Emitter.once(事件监听器);
如myemitter.once('show功能(TXT){ console.log(TXT)});
没有输出时,myemitter.emit执行第二次
* /

RemoveListener:{功能:removelistener },
*
当回调函数不能用于匿名函数时,将删除指定事件的指定回调。
Emitter.removeListener(事件监听器);
作为
功能显示(TXT){ console.log(TXT)};
MyEmitter.on('show节目);
console.log(myemitter。_events);
显示:{函数:}
MyEmitter.removeListener('show节目);
console.log(myemitter。_events);
{
* /

removealllisteners:{功能:removealllisteners },
*
删除所有指定的事件回调函数
Emitter.removeAllListeners({事件});
作为
MyEmitter.removeAllListeners('show '); / /删除所有显示监视器
(myemitter。removealllisteners); / /删除所有监控
* /

侦听器:{函数:侦听器}
*
查看指定侦听器
emitter.listeners(事件);
如myemitter.listeners('show '); / /返回一个数组。
与myemitter。_events { 'show'that我们前面用
* /

此外,事件类本身提供了一种方法。
events.listenercount(发射极、事件);获得指定数量的指定的情况下听
如event.listenercount(myemitter,'show)

-----------------------------------------------------------------------------------------------

两事件
newlistener / remotelistener,分别用于添加( /次)和删除(removelistener)操作的情况下,分别。
Emitter.on(事件监听器);
Emitter.on('newlistener功能(事件监听器){
console.log(emitter.listeners('show ')); / /注意听众尚未添加到emitter.listeners
console.log(参数);
});

Emitter.on('removelistener,函数(){(){
console.log(emitter.listeners('show '));
console.log(参数);
})

五、应用

使用事件,它通常是直接实例化的,如上面的API部分。

然而,如果我们也实现了一个构件在NodeJS的一面,如以前的对话框,对话框怎么也有事件的功能一个扩展的方案,可以实现与ExtJS

创建对话框生成器
var对话框=函数(){()
做某事
}

使用上述扩展,提供了深度复制属性
函数应用(源){
var args = array.prototype.slice.call(参数1);
对于(var i = 0,父;母=参数{我};i++){
对于(父中的var支持){
源{父} {父} };
}
}
}

抽象扩展函数,用于实现继承
函数(){()
内联/重写
函数(o){
对于(var在o){
此{ } };
}
};
VaR OC = object.prototype.constructor;

返回函数(SB,SP,重写){
如果(typeof SP = = 'object){
重写= sp;
某人;
某人overrides.constructor!= OC overrides.constructor:函数(){ sp.apply(这个参数);};
}
Var(f =函数){ },
SBP,
SPP = sp.prototype;

f.prototype =属;
收缩压= sb.prototype =新的f();
构造函数=某人;
某人的父=属;
如果(spp.constructor = = OC){
spp.constructor = SP;
}
sb.override =功能(o){
应用(某人,O);
};
sbp.superclass = sbp.supr =(函数(){()
回属;
});
sbp.override = IO;
应用(某人,重写);
sb.extend =功能(o){ return扩展(某人,O);};
还给某人;
};
(});

事件属性继承到对话框
对话框扩展(对话框,事件);

这个新方法显示了事件触发触发器
dialog.prototype.show =功能(TXT){
This.emit('show,TXT);
}

新对话框();

添加监视器事件显示
Dialog.on('show功能(TXT){ console.log(TXT)});

方法,将触发显示事件中定义的,这是显示输出。
dialog.show(这是节目);

这实现了组件的事件机制,当调用该方法时,它触发事件。

六。总结

Nodejs提供监测机制,并在所有模块中的应用,它支持我 / O模式的Nodejs特征,如果我们启动HTTP服务将监视其连接/关闭,http.request /最终将监测数据,了解学习和理解Nodejs监控机制,但提高编程思想也有益。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部