today, 我们的话题作文是nodejs,我尝试对它的描述是:似曾相似,但它又不一样的存在着。百花齐放的it世界里,以独特身姿绽放的美丽更容易吸引人。也许只是不了解,也许时间会给出答案,nodejs你值得拥有。
本篇了解一下nodejs的事件驱动。
Node.js 事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
事件发射器:EventEmitter
类
通过 require('events').EventEmitter
获取 EventEmitter 类。
通过一个列子来看一下EventEmitter类中事件发送以及事件监听的功能封装。
创建events.js文件:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
events.on("Click",function(){
console.log("This Click Event");
});
setTimeout(function(){
events.emit("Click");
},1000);
执行脚本:
E:\NodeJS>node events.js
This Click Event
emitter.on(event, listener)
添加一个监听者到特定 event
的监听数组的尾部,触发器不会检查是否已经添加过这个监听者。 多次调用相同的 event
和 listener
将会导致 listener
添加多次。
比如说往events.js中编写如下内容:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
events.on("Click",function(){
console.log("This Click Event 1");
});
events.on("Click",function(){
console.log("This Click Event 2");
});
setTimeout(function(){
events.emit("Click");
},1000);
执行脚本:
E:\NodeJS>node events.js
This Click Event 1
This Click Event 2
事件都会被监听,而且会依次执行。
emitter.addListener(event, listener)或者emitter.once(event, listener)
给事件添加一个一次性的 listener,这个 listener 只会被触发一次,之后就会被移除。没有监听的事件将一直处于等待状态。
比如说往events.js中编写如下内容:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
events.once("Click1",function(){
console.log("This Click Event 1");
});
events.on("Click2",function(){
console.log("This Click Event 2");
});
setInterval(function(){
events.emit("Click1");
},1000);
setInterval(function(){
events.emit("Click2");
},1000);
执行脚本:
E:\NodeJS>node events.js
This Click Event 1
This Click Event 2
This Click Event 2
once注册的事件只会被监听一次,其后将不会被触发。
emitter.removeListener(event, listener)
从一个某个事件的 listener 数组中移除一个 listener。
比如说往events.js中编写如下内容:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
var callback1=function(){
console.log("This Click Event 1");
}
var callback2=function(){
console.log("This Click Event 2");
}
events.on("Click",callback1);
events.on("Click",callback2);
events.removeListener("Click",callback2);
setTimeout(function(){
events.emit("Click");
},1000);
执行脚本:
E:\NodeJS>node events.js
This Click Event 1
被移出监听的事件其后将不会被触发。removeListener
最多会移除数组里的一个 listener。如果多次添加同一个 listener 到数组,那就需要多次调用removeListener
来移除每一个实例。
emitter.removeAllListeners([event])
移出所有监听事件。
emitter.setMaxListeners(n)
设置每个监听事件的最大个数。
EventEmitter.defaultMaxListeners
设置每个监听事件的默认个数。
emitter.listeners(event)
返回事件的 listener 数组。
emitter.emit(event[, arg1][, arg2][, ...])
使用指定的参数顺序的执行每一个 listener.
如果事件有 listener,返回 true
, 否则 false