• 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)

  • 相关阅读:
    dsoframer设计笔记
    pb 使用ole控制进行WORD操作失败-9
    【学习笔记】Fragment
    Suggest:the suffix for classes name
    ArrayList和LinkedList
    Android Studio入门
    asp.net ToString() 输出格式详细
    Uploadify 3.2 参数属性、事件、方法函数详解
    基础解析正则表达式
    10个优秀的 Web UI库/框架
  • 原文地址:https://www.cnblogs.com/wangweizhang/p/10901605.html
Copyright © 2020-2023  润新知