四. 什么是事件,它又如何工作,EventEmitter是个什么货? 什么是事件?
Q:哈,我想我已经学会如何使用process这个东西了!
A:不错,学习的速度很快,那么期间有没有发现什么问题?
Q:怎么会有问题发生在我的身上?!绝不可能!
A:哦?看样子自满了,那么我问你一个问题,其中在案例中使用到了process.stdin.emit这个方法,那么这个你是否理解呢?而你是否又会感悟到什么呢?
Q:额,这个嘛...,额,其实我感觉,它...(汗...)
A:呵呵,看样子你的智商是个硬伤啊!
Q:好吧,我认输了,我的确不知道这个做什么的,我只是照着样子做了而已,那么请您告诉我这个有什么意义吗?
A:好吧,这个process.stdin.emit从字面的意思来看就是“进程中的标准输入流执行触发操作“,而触发的是什么就要看具体参数了,案例中是出发了“end”操作,也就是终止了输入流的操作。
Q:哦,明白了,其实和我心里考虑的差不多,只是不敢确定而已。
A:呵呵。
Q:那么是不是只有process.stdin这个对象里面才会有这个emit方法呢?
A:不是的,这里面就要迁出一个新的问题,而且这个问题很重要,这个问题就是Node.js的核心,事件驱动模型。
Q:哇,听着好高级,好不懂啊。
A:的确,要理解这个需要一些时间去习惯和接受。
Q:那么就请您相信的讲解一下什么是事件吧。
A:好的。
A:从概念上来说,事件就是由于某种外在或内在的信息状态发生的变化,从而导致出现了对应的反应。
Q:那能通俗的解释一下吗?
A:当然,Node.js的事件模型是建立在观察者模式下的,而之前所说的监听器也是基于这个模式的,所谓的观察者就好比,你就是个观察者,而你看到大排档,就突然有了反应流出了口水,这就是观察者模式,当然你也是监听器,你一直在观察或者监听周围的环境,当出现了你所感冒的事物,你就有了反应,比如流口水。
Q:哦,这样一说就明白了很多,那么这样是不是也能解释为什么Node.js的逻辑不是线性的了呢?
A:是的,观察者模式并没有顺序而言,它只是依据当前或者某一状态下所触发的事件,那么从另一方面来说,Node.js就非常适合做实时交互的应用了。
Q:那么我明白了,那么请告诉我在Node.js中事件是如何工作的吧!
它又如何工作?A:当然可以,Node.js中的事件无处不在,基本所有的对象都会有事件,那么它如何工作呢?其实分为这么几步。
为某个对象绑定事件(通过on这个方法绑定),也可以理解为为某个对象添加一个或多个观察者(通过callback设定事件,即回调方法),来观察这个对象的动作
这个对象在某个状态或操作下,触发事件,或者说激活观察者行为(通过emit激活某类事件或观察者);
被激活的事件执行相应的处理(执行callback方法);
Q:哦,那我现在知道执行过程了,可是我还是不明白,能不能给我一些实际的例子呢?
A:当然可以。
EventEmitter是个什么货?A:这个时候就需要EventEmitter出场了。
Q:EventEmitter?这是什么?
A:EventEmitter是Node.js中事件的核心对象,所有的事件基本都是通过这个对象完成构建的!这是非常之重要的对象,而且没有之一。
Q:这么厉害,那么就快点告诉我该如何使用它构建我自己的事件吧!
A:好,不过也要慢慢来,下面就给出几个简单案例你先慢慢消化。
通过EventEmitter构建事件代码如下:events-emitter.js
执行效果如下:
为对象添加事件绑定代码如下:event-install.js
执行效果如下:
通过继承为对象绑定事件代码如下:event-inherits.js
执行效果如下:
Q:上面是一些事件中的添加事件和执行的三种方法,当然还有其他的方法我没有给你说,在后面的时间里会慢慢补充,当然你也可以先参照这个API进行操作,。
A:看样子我还是要消化一下,看起来好像容易发生错误的样子。
Q:是的,这里其实牵扯到了很多知识,不过不要问太多的为什么,首先呢你先会使用这些,等到你的知识储备多的时候自然就慢慢懂了,但是核心的概念要明确!
A:那还不是很简单,不过让我先试试这写代码。
附件event source 下载:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2014年资料/9月/20日/Node.js 教程
------------------------------------------分割线------------------------------------------