24
Feb 2014
event
Node

温习Node基础(2)——事件

字数:959

作者:Jerry

Nodejs在github上有这样一句介绍:Evented I/O for V8 JavaScript。基于V8引擎实现的事件驱动IO。事件驱动,是Nodejs这么受欢迎的很重要的一个原因,本章会深入Nodejs的事件部分。

在Nodejs之前,后端JavaScript技术已经有了。而Nodejs的出现,改变了两个状况:

  1. 统一了前后端JavaScript的编程模型。
  2. 利用事件机制充分利用异步IO突破单线程编程模型的性能瓶颈,是JavaScript在后端达到实用价值。

事件机制的实现

Nodejs中的大部分模块,都继承自Event模块。

Event模块(events.EventEmitter)是一个简单的事件监听器模式的实现,具有addListener/on,once,removeListener,removeAllListeners,emit 等基本的事件监听模式的方法实现。当然,它和前端DOM树上的事件不同,不存在冒泡、捕获,也没有preventDefault()等处理事件传递的方法。

另外,事件监听器模式也是事件钩子(hook)的机制,利用事件钩子将内部数据或状态暴露给外部调用者。

事件机制的进阶应用

继承events.EventEmitter

继承events.EventEmitter类很简单,以下是Nodejs中流对象继承EventEmitter:

function Stream(){
    events.EventEmitter.call(this);
}
util.inherits(Stream,events.EventEmitter);

多事件之间协作

在渲染一张页面时,通常要从多个数据源拉取数据并渲染至客户端。Nodejs中可以方便地同时并行发起对多个数据源的请求。

api.getUser("username",function(profile){
    // got the profile
});
api.getTimeline("username",function(timeline){
    // got the timeline
});
api.getSkin("username",function(skin){
    // got the skin
});