美文网首页
node.js常用内置模块--Events

node.js常用内置模块--Events

作者: 31313_iOS | 来源:发表于2020-12-16 16:46 被阅读0次

    大部分Node.js核心API是围绕一个惯用的异步事件驱动体系结构构建的,在这种体系结构中,某些类型的对象(称为“发射器(emitters)”)发出命名事件,从而导致函数对象(“侦听器(listeners)”)被调用。

    所有发出事件的对象都是EventEmitter类的实例。通常,事件名称是大小写为驼峰大小写的字符串,但可以使用任何有效的JavaScript属性键。当EventEmitter对象发出事件时,所有附加到该特定事件的函数都将被同步调用。被调用的侦听器返回的任何值都将被忽略和丢弃。

    下面通过一些例子来了解EventEmitter对象的使用。更多的使用方法可以直接查看官网对于Events的介绍。

    一、引入EventEmitter对象

    const EventEmitter = require('events');
    

    二、创建EventEmitter对象

    // 创建EventEmitter对象
    const emitter = new EventEmitter();
    

    三、基本使用

    1. 监听事件 emitter.on(eventName, listener)
    // 监听click事件
    emitter.on('click', (e) => {
       console.log('监听到了click点击', e); //监听到了click点击 { name: 'Click-Passer', age: 18 }
    })
    
    2.发送事件 emitter.emit(eventName[, ...args])

    发送事件可以携带一些参数,下面的例子就是携带了{name: 'Click-Passer', age: 18}

    setTimeout(() => {
       emitter.emit('click', {name: 'Click-Passer', age: 18})
    }, 2000)
    
    3.移除事件 emitter.off(eventName, listener)

    它是v10.0.0增加的方法,是 emitter.removeListener()的别名

    function b(e) {
       console.log('监听到了tap点击', e); //监听到了tap点击 { name: 'Tap-Passer', age: 28 }
    }
    //开始监听tap事件
    emitter.on('tap', b)
    
    //发送tap事件,并传送了参数 {name: 'Tap-Passer', age: 28}
    //emitter.emit('tap')
    emitter.emit('tap', {name: 'Tap-Passer', age: 28})
    
    //移除事件
    emitter.off('tap', b)
    

    三、常见的属性

    EventEmitter的实例有一些属性,可以获取相关的信息。

    • emitter.eventNames()

    获取当前 EventEmitter对象注册的事件字符串数组。

    const names = emitter.eventNames()
    console.log(names);  //[ 'click', 'tap']
    
    • emitter.getMaxListeners()

    获取当前EventEmitter对象的最大监听器数量,默认10。

     const maxListeners = emitter.getMaxListeners()
     console.log(maxListeners); // 10
    
    • emitter.setMaxListeners()

    修改当前EventEmitter对象的最大监听器数量。

    // 修改最大监听器数量
     emitter.setMaxListeners(30)
    
    • emitter.listeners(eventName)

    获取当前EventEmitter对象某个事件监听器上所有的监听器数组.

    const listeners = emitter.listeners('click')
    console.log(listeners); //[ [Function]]
    
    //根据返回值方法也可以调用
     listeners[0](33) ; // //监听到了click点击 33
    
    
    • emitter.listenerCount(eventName)

    获取当前 EventEmitter对象某一个事件名称,监听器的个数;

       const clickCount = emitter.listenerCount('click')
       console.log(clickCount); // 1
    

    四、其他常用方法

    • emitter.once(eventName, listener)

    当前 EventEmitter对象的某一个监听事件只会监听一次。

    emitter.once('once', (e) => {
       console.log('只监听一次的被调用了', e);
    })
    
    setTimeout(() => {
        emitter.emit('once', {name: 'Once-Passer', age: 38})
        emitter.emit('once', {name: 'Once-Passer'})
    }, 2000)
    
    • emitter.prependListener(eventName, listener)

    当前 EventEmitter对象将某个监听事件添加到最前面 ,是对于相同eventName监听事件。

    emitter.prependListener('click', (e) => {
       console.log('将监听事件添加到最前面', e);
    })
    setTimeout(() => {
       emitter.emit('click', {name: 'Click-Passer', age: 18})
    },2000)
    //将监听事件添加到最前面 { name: 'Click-Passer', age: 18 }
    //监听到了click点击 { name: 'Click-Passer', age: 18 }
    
    
    • emitter.prependOnceListener(eventName, listener)

    当前 EventEmitter对象将某个监听事件添加到最前面且只调用一次

    emitter.prependOnceListener('click', (e) => {
       console.log('将监听事件添加到最前面且只监听一次', e);
    })
    setTimeout(() => {
       emitter.emit('click', {name: 'Click-Passer', age: 18})
    },2000)
    
    //将监听事件添加到最前面且只监听一次 { name: 'Click-Passer', age: 18 }
    //将监听事件添加到最前面 { name: 'Click-Passer', age: 18 }
    //监听到了click点击 { name: 'Click-Passer', age: 18 }
    
    

    从输出可以看出,同一个eventName他们调用顺序 prependOnceListener -> prependListener -> on

    • emitter.removeAllListeners([eventName])

    当前 EventEmitter对象移除所有的监听器

    //移除所有的监听器
    emitter.removeAllListeners()
    
    // 移除emitter上的click事件监听
    emitter.removeAllListeners("click");
    

    更多的使用方法可以直接查看官网对于Events的介绍。

    相关文章

      网友评论

          本文标题:node.js常用内置模块--Events

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