[Node.js]四. 什么是事件,它又如何工作,EventEmitter是个什么货?

四. 什么是事件,它又如何工作,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中的事件无处不在,基本所有的对象都会有事件,那么它如何工作呢?其实分为这么几步。

  1. 为某个对象绑定事件(通过on这个方法绑定),也可以理解为为某个对象添加一个或多个观察者(通过callback设定事件,即回调方法),来观察这个对象的动作

  2. 这个对象在某个状态或操作下,触发事件,或者说激活观察者行为(通过emit激活某类事件或观察者);

  3. 被激活的事件执行相应的处理(执行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进行操作,http://www.nodejs.org/api/events.html。

A:看样子我还是要消化一下,看起来好像容易发生错误的样子。

Q:是的,这里其实牵扯到了很多知识,不过不要问太多的为什么,首先呢你先会使用这些,等到你的知识储备多的时候自然就慢慢懂了,但是核心的概念要明确!

A:那还不是很简单,不过让我先试试这写代码。


你可能感兴趣的:(node.js,events,EventEmitter)