Node.js 事件触发器详细总结

    xiaoxiao2022-06-25  313

    Node.js 事件触发器详细总结

    Api目录

      1、简单的注册、触发事件的流程

      2、eventEmitter.defaultMaxListeners

      3、emitter.setMaxListeners(n)

      4、emitter.getMaxListeners(n)

      5、emitter.prependListener(eventName, listener);

      6、emitter.prependOnceListener(eventName, listener)

      7、emitter.removeListener(eventName, listener)

      8、emitter.removeAllListeners(eventName)

      9、emitter.off(eventName, listener)

      10、emitter.eventNames()

      11、emitter.on('eventName', listener)

      12、emitter.once('eventName', listener)

      13、emitter.emit('eventName', params)

     

    一、什么是事件模块(events)

    1、大多数Node.js核心Api都是采用惯用的异步事件驱动架构

    2、所有能触发事件的对象都是EventEmitter类的实例

    3、事件流程:引入模块 -> 实例化EventEmitter类 -> 注册事件 -> 触发事件

     

    二、举例说明Api

    1、简单的注册、触发事件的流程

    // 引入事件模块 const eventEmitter= require('event').EventEmitter; // 实例化EventEmitter类 let emitter = new eventEmitter(); // 注册事件 emitter.on('someEvent', function(){ console.log('触发事件') }) // 触发事件 emitter.emit('someEvent') // 打印:触发事件

    注:node.js官方文档中,api的EventEmitter 和 emitter 在此所指:

    a、所有 EventEmitter 对象指的就是 eventEmitter 对象

    b、所有 emitter 实例,指的就是上面实例化的 emitter 对象

     

    2、eventEmitter.defaultMaxListeners

    EventEmitter下所有实例的可注册监听器个数的默认值. 默认是10个.(注:是改变EventEmitter下所有实例的);

    console.log(eventEmitter.defaultMaxListeners); //打印:10

     

    3、emitter.setMaxListeners(n)

    改变指定的单个 EventEmitter 实例的最大注册数量; 值设为 Infinity(或 0)表示不限制监听器的数量。

    4、emitter.getMaxListeners(n)

    获取单个实例最大监听器数量

    // 设置单个实例最大监听器数量 emitter.setMaxListeners(15); // 获取单个实例最大监听器数量 let getMaxListeners = emitter.getMaxListeners(); console.log(getMaxListeners); // 打印:15

     

    5、emitter.prependListener(eventName, listener);

    eventName: 已经注册的监听器名称

    listener: Function 回调

    用来指定多个相同eventName的监听器中,首先调用哪个listener回调.(原理是将指定监听器,添加到监听器数组的开头,本质还是顺序执行)

    // test1 listener监听方法 function test1 () { console.log('a') } // test2 listener监听方法 function test2 () { console.log('b') } // 绑定foo事件 emitter.on('foo', test1); // 将test2监听器方法放在监听器数组的头部,首先执行 emitter.prependListener('foo', test2); emitter.emit('foo') // 打印:'b' 'a'

     

    6、emitter.prependOnceListener(eventName, listener)

    eventName: 已经注册的监听器名称

    listener: Function 回调

    添加一个只能执行一次的eventName事件监听器,下次再触发时,当前监听器会被先移除,然后在调用.

    添加单次监听器 listener 到名为 eventName 的事件的监听器数组的开头 ( 当 eventName 事件第二次触发时,监听器会先被移除,然后再调用。)

     

    7、emitter.removeListener(eventName, listener)

    从名为 eventName 的事件的监听器数组中移除指定的 listener

    // removeListener:删除监听器触发 emitter.on("removeListener", function (event, listener) { console.log("移除了-" + event + "事件的" + listener "监听器") }); // 绑定test事件,并将tests作为test事件的listener emitter.on("test", tests); function tests(){ console.log("测试事件") }; // 触发test事件 emitter.emit("test"); // 删除test的事件监听数组中的tests监听器 emitter.removeListener("test", tests); // 打印: // 测试事件 // 移除了 test 事件的 tests 监听器

     

    8、emitter.removeAllListeners(eventName)

    移除全部监听器或指定的 eventName 事件的所有监听器

    // test1事件 只有一个监听器 emitter.on("test1", function (data) { console.log(data) }); // test2事件 只有一个监听器 emitter.on("test2", function (data) { console.log(data) }); // test3 事件有两个监听器 分别是 test3s 和 test3ss emitter.on("test3", test3s); emitter.on("test3", test3ss); function test3s(data) { console.log(data) } function test3ss(data) { console.log(data) } // 移除监听器触发 emitter.on("removeListener", function (event, listener) { console.log("移除了-" + listener + "事件") }); emitter.emit("test1", '1'); // 1 emitter.emit("test2", '2'); // 2 emitter.emit("test3", '3'); // 3 3 //移除test3下面所有的监听器 emitter.removeAllListeners('test3'); // 第一次:移除了test3s 第二次:移除了test3ss emitter.emit("test1", '4'); // 4 emitter.emit("test2", '5'); // 5 emitter.emit("test3", '6'); // 无结果因为test3事件的监听器全部移除了

     

    9、emitter.off(eventName, listener)

    removeListener的别名

     

    10、emitter.eventNames()

    返回emitter实例下已注册的事件名数组。 数组中的值为字符串;

    emitter.once('loadOnce', function () { console.log(); }); emitter.on('load', function () { console.log(); }); emitter.emit('load'); console.log(emitter.eventNames()); // 打印:[ 'loadOnce', 'load' ] emitter.emit('loadOnce'); console.log(emitter.eventNames()); // 打印:['load' ] // 原因: 因为once绑定的事件,执行一次之后就会移除。

     

    11、emitter.on('eventName', listener)

    eventName:事件名称

    listener:回调函数

    注册名称为eventName、回调函数为listener的事件

     

    12、emitter.once('eventName', listener)

    注册一次性名称为eventName,回调函数为listener的事件

    注意:只触发一次,就会将其移除。

     

    13、emitter.emit('eventName', params)

    params:any 任意类型

    触发名称为eventName的事件,按监听器数组顺序执行所有回调函数。

     

    注意:以上nodejs事件的api,都是作者辛苦练习总结出来的,转载需注明转载地址,谢谢配合!

     

    4、emitter.getMaxListeners(n)

    posted @ 2019-05-21 18:35 王维璋 阅读( ...) 评论( ...) 编辑 收藏

    最新回复(0)