node对事件的处理,类似观察者模式。比delphi可强太多了,delphi的某个对象,一旦给on...值了,以前的处理就被冲抵了,只能执行一个~
/**参考:http://nodejs.cn/api/events.html
* Created by liyanq on 17/3/18.
* 1,require("events")导出的是一个函数,一个构造函数,所以得用new来使用。
* 2,可以用对象的getMaxListeners、setMaxListeners来获取和设置最大监听数,默认是10;
* 3,emitter 的触发不存在冒泡, 逐层捕获等事件行为, 也没有处理事件传递的方法。这点很重要。
* 4,EventEmitter的emit是同步的,监听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式.
* 但setImmediate()和process.nextTick()都有一定的延迟,见myEvent3
* 5,removeAllListeners、removeListener删除事件监听。如果是匿名处理事件,那么不能删除单个监听。
* 6,EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 'newListener' 事件
* 所以要避免事件名称是"newListener"...
* 7,on、once、prependListener、prependOnceListener、addListener都可链式调用
*/
var events = require("events");
/*{ [Function: EventEmitter]
EventEmitter: [Circular],
usingDomains: false,
defaultMaxListeners: [Getter/Setter],
init: [Function],
listenerCount: [Function] }*/
var myEvent = new events;
myEvent.on("event1", function event1Handle() {
myEvent.on("event1", event1Handle);
console.log("event1");
});
myEvent.emit("event1");//event1
myEvent.emit("event1");//event1,event1
console.log("----------------------------------------");
var myEvent2 = new events;
var otherEventHandle = function () {
console.log("other event2");
};
myEvent2.on("event2", otherEventHandle);
myEvent2.emit("event2");
myEvent2.removeListener("event2", otherEventHandle);
myEvent2.emit("event2");//被删除了。
console.log("----------------------------------------");
//EventListener 会按照监听器注册的顺序同步地调用所有监听器
var myEvent3 = new events;
myEvent3.on("event3-sync", function () {
setImmediate(function () {
console.log("我是同步顺序执行的1")
});
});
myEvent3.on("event3-sync", function () {
setImmediate(function () {
console.log("我是同步顺序执行的2")
});
});
myEvent3.on("event3-async", function () {
process.nextTick(function () {
console.log("我是异步执行的1")
});
});
myEvent3.on("event3-async", function () {
process.nextTick(function () {
console.log("我是异步执行的2")
});
});
myEvent3.emit("event3-sync");
myEvent3.emit("event3-async");
//setImmediate()和process.nextTick()都有一定的延迟
//once同一事件的同一监听函数在收到多次emit后,只执行一次;on是有多少个emit执行多少次;
var myEvent4 = new events;
myEvent4.once("event4", function oneFun () {
console.log("oneFun:我只执行一次");
console.log("----------------------------------------");
});
myEvent4.once("event4", function twoFun () {
console.log("twoFun:我只执行一次");
console.log("----------------------------------------");
});
myEvent4.emit("event4");
myEvent4.emit("event4");//这次的emit被忽略了~
//'newListener' 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入 。
var myEvent6 = new events;
myEvent6.once("newListener",function (event,listener) {
if (event === "event6"){
myEvent6.on("event6",function () {
console.log("我是newListener里面处理的");//先执行
});
}
});
myEvent6.addListener("event6",function () {//addListener和on一样~
console.log("我是匿名函数里面处理的");
console.log("----------------------------------------");
});
myEvent6.emit("event6");
var myEvent7 = new events;
myEvent7.on("event7",function () {
});
var event7Handle = function () {
};
myEvent7.on("event7",event7Handle);
console.log(myEvent7.listeners("event7"));//[ [Function], [Function: event7Handle] ]
console.log("----------------------------------------");
//为了防止 Node.js 进程崩溃,可以在 process 对象的 uncaughtException 事件上注册监听器
//需要注意的是,一旦监听函数里面发生了异常,后面的emit就会被忽略了,所以这个放在了最后...
var myEvent5 = new events;
process.once("uncaughtException", function (error) {
console.log("错误信息已经处理:" + error + "进程号:" + process.getgid());
console.log("----------------------------------------");
});
myEvent5.on("event5", function () {
throw new Error("我是错误信息");
});
myEvent5.emit("event5");