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

posted on 2016-03-14 15:34  巴夫巴夫  阅读(341)  评论(0编辑  收藏  举报