Node.js:理解使用事件发射器模式简化事件绑定

jopen 10年前

Node.js的核心是异步和回调,就是所说的事件驱动编程和函数回调。但是要是需要处理的事物是具有特定的顺序的化,实现的时候需要使用递归来处理。CommonJS标准 每个模块都由一个上下文将该模块与其他模块隔离

 标准的回调模式:
(CPS Continuation-passing style):后继传递风格
    异步编程风格是一种程序的流程控制权以后继的形式被显式的传递的编程风格。
    按后继传递风格编写的函数以一个显式的"后继"作为额外的参数,"后继"实际
    上是一个函数,当CPS函数计算出返回值时,它就调用后继函数,并将  CPS
    函数的返回值作为参数。这种模式能够很好的处理函数执行结束后需要通知客户端的情况。

var fs = require('fs');
fs.readFile('/etc/passwd',function(err,fileContent){
    if(err){
        throw err;
    }
    console.log("fileContent " + fileContent.toString());
});
//回调函数第一个参数是一个错误对象,如果有错误发生,这个参数就是Error的一个实例,这就是比Node中的应用CPS编程的一般模式。

理解事件发射器模式:
事件发射器:可以发射事件的对象。
事件监听器:绑定到事件发射器上的代码,负责监听特定类型的事件。

理解事件类型:
发射的事件具有一定的类型,类型用一个字符串表示如"data","end","on" 等,他们都是由事件发射器定义的任意字符串。当你使用到API时
应该会有对应的文档记录他能够发射的事件类型。 一旦有事件发生,事件发射器就会调用相应的事件监听器,并将相关数据作为参数传递给事件监听器。
虽然事件发生器时服务任意类型事件的通用接口,但在Node的实现中有一个特例即error事件,Node中大多数事件发射器实现在程序发生错误时都会发射"error"事件,所以都要监听这个错误事件,防止向上抛出异常。

应用事件发射器API:
    任何实现了事件发射器模式的对象(例如:TCP http等)都实现了:
    1:addListener 和on ->为指定的事件添加事件监听器
    2:once->为指定的事件添加只会调用一次的事件监听器
    3:removeEventListener ->删除绑定到指定事件上的某个指定的事件监听器。
    4:removeAllEventListener ->删除绑定到指定事件上的全部的事件监听器。
允许绑定多个事件监听器。根据事件类型,事件发射器负责按照事件所绑定的监听器的注册顺序依次调用事件监听器。这就意味着:
    1:某个事件监听器也许并不会在事件发射之后就立即被调用,也许在它之前还有别的事件监听器被调用。
    2:异常被抛出到堆栈并不正常,他通常时有代码中的错误引起的。

创建事件发射器:
    1:从Node事件发射器继承
        var util = require('util');
        var eventEmitter = require('events').EventEmitter;
        var myClass = function(){}
        util.inherits(myClass,eventEmitter);//util.inherits建立了一条原型链,使myClass类实例能够使用EventEmitter的原型方法