美文网首页
node系列之events(事件)

node系列之events(事件)

作者: 一溪酒 | 来源:发表于2016-12-20 20:56 被阅读34次

    地址

    传送门

    说明

    万物基于事件。这句话虽然有点夸张,但是在nodejs的世界里,还是挺有道理的。很多的模块,都是继承于event。比如,http,file等,都有事件的影子。http监听一个请求事件,文件可以监听读取数据。

    基本用法

    const EventEmitter = require('events');
    class MyEmitter extends EventEmitter {}
    const myEmitter = new MyEmitter();
    myEmitter.on('event', () => { 
      console.log('an event occurred!');
    });
    myEmitter.emit('event');
    

    监听事件: on
    触发事件: emit
    需要注意的是,监听事件需要放在触发事件之前,不然会导致异常,进程可能直接退出。当然,如果不想进程直接简单粗暴地退出,可以使用下面语句

    process.on('uncaughtException', (err) => { 
      console.log('whoops! there was an error');
    });
    // 上面这堆东西也是需要尽可能得放在程序前面哦,不然会捕获不到错误事件的
    
    • newListener事件
      在任何的事件被添加(注册)之前,都会触发这个事件。
      比如,在 myEmitter.on('news')之前,就会先触发了myEmitter.emit('newListener')
      同理可得 removeListener事件

    • 查询注册的事件

    myEmitter.on( 'foo', () => {})
    myEmitter.on( 'bar', () => {})
    myEmitter.eventNames();
    // [ 'foo', 'bar']
    
    • 某个事件的个数
      myEmitter.listenerCount(eventName)

    • 响应某个事件之前执行
      myEmitter.prependListener(eventName,listener)
      myEmitter.prependOnceListener(eventName,listener)

    • 移除事件
      单个事件: emitter.removeListener(eventName, listener)
      全部事件:emitter.removeAllListeners([eventName])
      需要注意的是,removeListener不会影响当前的事件执行。比如,当有3个event事件,触发这个event事件的时候,会将这3个事件放到内部数组里面,不会受外界干扰。假如第一个listener移除了第2个listener,这3个事件依然会执行。到下一次再次出发这个事件的时候,只会执行第1和第3个事件。

    小结

    感觉这个event模块,设计得还是挺不错的。比如每次调用完一个方法后,都返回当前实例,这样就可以使用链式调用了。

    Returns a reference to the EventEmitter, so that calls can be chained.

    很多的模块都是基于此,虽然用得不是很多,但在某种场合下,用得还是挺6的。

    相关文章

      网友评论

          本文标题:node系列之events(事件)

          本文链接:https://www.haomeiwen.com/subject/pqxfvttx.html