• node的events模块


    events可以说是node实现异步的基石,也是其他几个常用核心模块api的异步方法的原型。

    1 var eventEmitter=require('events').EventEmitter;
    2 //var eventEmitter=require('events');  这样写也可以
    3 var myEvent=new eventEmitter();
    4 myEvent.on('shout',function(){console.log('Oh')})
    5 myEvent.emit('shout');

    引入events模块后,用它生成一个事件实例,就可以使用该实例的on方法监听(绑定)事件,emit方法触发事件,emit方法返回一个布尔值表示该事件是否已被监听。

    EventEmitter.addListener()和on()方法类似,用以添加事件;

    EventEmitter.removeListener(),用以移除事件;

    1.可以给一个事件绑定多个回调,触发时回调按注册顺序依次执行;但不建议绑定太多(实话,现实情况也完全很少遇到一个时间绑定超过3个callback),怕造成内存泄漏。绑定的回调超过十个node会警告,可以通过.setMaxListener(int)改动允许的最大绑定数。

    2.在事件的callback中,this指向myEvent本身;如果callback用的是箭头函数,则不指向myEvent,可能是个空对象{}。

    3.在callback中,可以使用setImmediate() 或 process.nextTick() 方法延迟代码的执行以达到异步的效果...嗯。。就像在客户端用定时器一样;不过这种做法在具体生产中。。看情况吧。。

    1 const myEmitter = new MyEmitter();
    2 myEmitter.on('event', (a, b) => {
    3   setImmediate(() => {
    4     console.log('this happens asynchronously');
    5   });
    6 });
    7 myEmitter.emit('event', 'a', 'b');

    4.eventEmitter.once():用法和.on()一样,不过.once绑定的事件只触发一次,再次触发会被忽略。(node绝对是参考了jQ啊有木有~~)

    5.‘error’事件,文档提到,如果一个EventEmitter运行过程中出现了错误,会抛出一个error事件;但如果EventEmitter没有监听error事件,而error被抛出,则node会打印堆栈的踪迹并退出进程。所以我们使用EventEmitter实例的时候往往要绑定一个error事件,哪怕只是log一下。

    6.newListener事件会被触发当我们给EventEmitter实例绑定事件的时候;removeListener事件会被触发当我们移除事件的时候。

     1 const myEmitter = new MyEmitter();
     2 // Only do this once so we don't loop forever
     3 myEmitter.once('newListener', (event, listener) => {
     4   if (event === 'event') {
     5     // Insert a new listener in front
     6     myEmitter.on('event', () => {
     7       console.log('B');
     8     });
     9   }
    10 });
    11 myEmitter.on('event', () => {
    12   console.log('A');
    13 });
    14 myEmitter.emit('event');
    15 // Prints:
    16 //   B
    17 //   A

    这里要注意,在触发newListener是事件的时候,newListener的回调会在绑定新事件的时候执行,因此log(B)在'event'被触发的时候就注册了。

    另外,代码第三行的listener参数,指向的是代码第12行的代码,即EventEmitter实例绑定'event'事件的回调。

    7.EventEmitter.listenerCount(emitter, eventName):静态的方法,返回一个EventEmitter实例监听的某个事件到底绑定了多少个回调,在文档中,listener指的就是某个event的callback。

    1 const myEmitter = new MyEmitter();
    2 myEmitter.on('event', () => {});
    3 myEmitter.on('event', () => {});
    4 console.log(EventEmitter.listenerCount(myEmitter, 'event'));
    5 // Prints: 2

    8.EventEmitter.defaultMaxListeners:默认的单个event最大listener数(对所有event都这样),为10,但实际上可以绑定第11、12个以上的listener,只是超过10个node会给出warning;

    emitter.setMaxListeners(n) :改变单个event的限制。

    .getMaxListeners():获取单个event的最大listener数,如果该event调用过.setMaxListeners(n)方法,则获取的是set后的值。

    1 emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    2 emitter.once('event', () => {
    3   // do stuff
    4   emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    5 });

    9.emitter.eventNames():返回一个数组,其元素是该EventEmitter实例绑定的事件名。

    10.emitter.listenerCount(eventName):返回实例绑定的某个事件的lietener数。

    11.emitter.listeners(eventName):返回一个数组,该数组成员是EventEmitter实例绑定的事件的lietener的副本。(个人觉得鸡肋)

    1 server.on('connection', (stream) => {
    2   console.log('someone connected!');
    3 });
    4 console.log(util.inspect(server.listeners('connection')));
    5 // Prints: [ [Function] ]

    12.emitter.prependListener(eventName, listener):将listener插入到某个event所注册的listeners队列的最前面,类似数组的unshift方法,由于event触发的时候listeners是按注册顺序逐个执行的,所以使用该方法的listener会第一个执行。

    13.emitter.prependOnceListener(eventName, listener):跟上面的prependListener()方法一样,只是prependOnceListener插入的listener只触发一次。

    14.emitter.removeAllListeners([eventName]):移除EventEmitter实例绑定的eventName的所有listeners。如果不传参,则该实例绑定的所有listeners都被移除。

    15.emitter.removeListener(eventName, listener):移除某个事件。这个callback必须是个句柄,和DOM二级事件的removeEventListener一样。另外,由于同一个listener可以反复添加给某个event,在触发时也会反复执行,此时想彻底清除该事件就得多次使用removeListener。

    好啦,events模块大体就这些方法。我是文档的搬运工。。。。。

  • 相关阅读:
    Python self,init,对象属性
    Python 注释,类,属性,方法,继承
    Python 循环与定义函数
    PHP中封装Redis购物车功能
    负数字符串经过int处理之后还是负数
    小程序模板template
    PHP里获取一维数组里的最大值和最小值
    Python缩进与if语句 空格的魅力
    maven 建立ssh项目
    tomcat war包部署
  • 原文地址:https://www.cnblogs.com/alan2kat/p/7426669.html
Copyright © 2020-2023  润新知