深入浅析nodejs中的events模块

本篇文章和大家详细介绍一下node中的events模块。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

深入浅析nodejs中的events模块

相关推荐:《node》

events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http、fs等。本文将详细介绍nodeJS中的事件机制

EventEmitter

  多数 Node.js 核心 API 都是采用惯用的异步事件驱动架构,其中某些类型的对象(称为触发器)会周期性地触发命名事件来调用函数对象(监听器)。例如,一个net.Server对象会在每次有新连接时触发一个事件;一个 fs.ReadStream 会在文件被打开时触发一个事件;一个 stream会在数据可读时触发事件。

【EventEmitter】

  EventEmitter 类由 events 模块定义和开放的,所有能触发事件的对象都是 EventEmitter 类的实例

var EventEmitter = require('events');/*{ [Function: EventEmitter]  EventEmitter: [Circular],  usingDomains: false,  defaultMaxListeners: [Getter/Setter],  init: [Function],  listenerCount: [Function] } */console.log(EventEmitter);

登录后复制

  events模块的EventEmitter属性指向该模块本身

var events = require('events');console.log(events.EventEmitter === events);//true

登录后复制

  EventEmitter是一个构造函数,可以用来生成事件发生器的实例emitter

var EventEmitter = require('events');var emitter = new EventEmitter();/*EventEmitter {  domain: null,  _events: {},  _eventsCount: 0,  _maxListeners: undefined } */console.log(emitter);

登录后复制

方法

【emitter.emit(eventName[, …args])】

eventName ...args 

登录后复制

  该方法按监听器的注册顺序,同步地调用每个注册到名为eventName事件的监听器,并传入提供的参数。如果事件有监听器,则返回true,否则返回false

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test1',function(){});console.log(emitter.emit('test1'));//trueconsole.log(emitter.emit('test2'));//false

登录后复制

【emitter.on(eventName, listener)】

  该方法用于添加listener函数到名为eventName的事件的监听器数组的末尾

eventName  事件名listener  回调函数

登录后复制登录后复制

  [注意]不会检查listener是否已被添加。多次调用并传入相同的eventName和listener会导致listener被添加与调用多次

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);});emitter.on('test',function(){    console.log(2);});emitter.emit('test');//1 2

登录后复制

  该方法返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);}).on('test',function(){    console.log(2);});emitter.emit('test');//1 2

登录后复制

【emitter.addListener(eventName, listener)】

  emitter.on(eventName, listener) 的别名

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.addListener('test',function(){    console.log(1);});emitter.emit('test');//1

登录后复制

【emitter.prependListener()】

  与on()方法不同,prependListener()方法可用于将事件监听器添加到监听器数组的开头

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);}).prependListener('test',function(){    console.log(2);});emitter.emit('test');//2 1

登录后复制

【emitter.once(eventName, listener)】

  该方法添加一个单次 listener 函数到名为 eventName 的事件。 下次触发 eventName 事件时,监听器会被移除,然后调用

eventName  事件名listener  回调函数

登录后复制登录后复制

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);}).once('test',function(){    console.log(2);});emitter.emit('test');//1 2emitter.emit('test');//1

登录后复制

【emitter.prependOnceListener() 】

  该方法用于将事件监听器添加到监听器数组开头。下次触发eventName事件时,监听器会被移除,然后调用

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);}).prependOnceListener('test',function(){    console.log(2);});emitter.emit('test');//2 1emitter.emit('test');//1

登录后复制

【emitter.removeAllListeners([eventName])】

eventName 

登录后复制登录后复制

  移除全部或指定 eventName 的监听器,返回一个 EventEmitter 引用,可以链式调用

  [注意]在代码中移除其他地方添加的监听器是一个不好的做法,尤其是当 EventEmitter 实例是其他组件或模块(如 socket 或文件流)创建的

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);}).removeAllListeners('test');emitter.emit('test');//''

登录后复制

【emitter.removeListener(eventName, listener)】

eventName listener 

登录后复制

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

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){    console.log(1);}emitter.on('test',show).removeListener('test',show);emitter.emit('test');//''

登录后复制

  [注意]removeListener最多只会从监听器数组里移除一个监听器实例。如果任何单一的监听器被多次添加到指定eventName的监听器数组中,则必须多次调用removeListener才能移除每个实例

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){    console.log(1);}emitter.on('test',show).on('test',show).removeListener('test',show);emitter.emit('test');//'1'

登录后复制

  [注意]一旦一个事件被触发,所有绑定到它的监听器都会按顺序依次触发。这意味着,在事件触发后、最后一个监听器完成执行前,任何 removeListener() 或 removeAllListeners() 调用都不会从 emit() 中移除它们。 随后的事件会像预期的那样发生

  因为监听器是使用内部数组进行管理的,所以调用它会改变在监听器被移除后注册的任何监听器的位置索引。 虽然这不会影响监听器的调用顺序,但意味着由 emitter.listeners() 方法返回的监听器数组副本需要被重新创建

var EventEmitter = require('events');var emitter = new EventEmitter();function show1(){    console.log(1);    emitter.removeListener('test',show2);}function show2(){    console.log(2);}emitter.on('test',show1).on('test',show2);emitter.emit('test');//1 2emitter.emit('test');//1

登录后复制

设置

【emitter.eventNames()】

  返回一个列出触发器已注册监听器的事件的数组。 数组中的值为字符串或符号

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.addListener('test1',function(){console.log(1);});emitter.addListener('test2',function(){console.log(2);});console.log(emitter.eventNames());//[ 'test1', 'test2' ]

登录后复制

【emitter.listenerCount(eventName)】

eventName  正在被监听的事件名

登录后复制

  返回正在监听名为 eventName 的事件的监听器的数量

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.addListener('test',function(){console.log(1);});emitter.addListener('test',function(){console.log(1);});console.log(emitter.listenerCount('test'));//2

登录后复制

【emitter.listeners(eventName)】

eventName 

登录后复制登录后复制

  返回名为 eventName 的事件的监听器数组的副本

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.addListener('test',function(){console.log(1);});emitter.addListener('test',function(){console.log(2);});console.log(emitter.listeners('test'));//[ [Function], [Function] ]emitter.listeners('test')[0]();//1

登录后复制

【emitter.getMaxListeners()】

  返回 EventEmitter 当前的最大监听器限制值

var EventEmitter = require('events');var emitter = new EventEmitter();console.log(emitter.getMaxListeners());//10

登录后复制

【emitter.setMaxListeners(n)】

  默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity(或 0)表明不限制监听器的数量。返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});/*Warning: Possible EventEmitter memory leak detected. 11 a listeners added. Use emitter.setMaxListeners() to increase limit */

登录后复制

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.setMaxListeners(11);emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});

登录后复制

【EventEmitter.defaultMaxListeners】
  每个事件默认可以注册最多10个监听器。单个EventEmitter实例的限制可以使用emitter.setMaxListeners(n)方法改变。所有EventEmitter实例的默认值可以使用EventEmitter.defaultMaxListeners属性改变

  [注意]设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有EventEmitter 实例,包括之前创建的。因而,调用 emitter.setMaxListeners(n) 优先于 EventEmitter.defaultMaxListeners

var EventEmitter = require('events');var emitter = new EventEmitter();EventEmitter.defaultMaxListeners = 11;emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});

登录后复制

事件

【’newListener’ 事件】

eventName  要监听的事件的名称listener  事件的句柄函数

登录后复制

  EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 ‘newListener’ 事件

  注册了 ‘newListener’ 事件的监听器会传入事件名与被添加的监听器的引用。事实上,在添加监听器之前触发事件有一个微妙但重要的副作用: ‘newListener’ 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入 

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('newListener',function(){    console.log(2);})emitter.on('test',function(){    console.log(1);})emitter.emit('test');//2 1

登录后复制

var EventEmitter = require('events');var emitter = new EventEmitter();emitter.on('test',function(){    console.log(1);})emitter.on('newListener',function(){    console.log(2);})emitter.emit('test');//1

登录后复制

【’removeListener’ 事件】

eventName  事件名listener  事件句柄函数

登录后复制

  ’removeListener’ 事件在 listener 被移除后触发

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){    console.log(1);}emitter.on('removeListener',function(){    console.log(2);//2})emitter.on('test',show).removeListener('test',show);

登录后复制

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){    console.log(1);}emitter.on('test',show).removeListener('test',show);emitter.on('removeListener',function(){    console.log(2);//''})

登录后复制

var EventEmitter = require('events');var emitter = new EventEmitter();function show(){    console.log(1);}emitter.removeListener('test',show);emitter.on('removeListener',function(){    console.log(2);//''})

登录后复制

更多编程相关知识,请访问:node!!

以上就是深入浅析nodejs中的events模块的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2634543.html

(0)
上一篇 2025年3月7日 04:34:11
下一篇 2025年3月1日 00:25:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • node.js使用multer中间件上传文件

    本篇文章给大家介绍一下node.js使用multer中间件解决post文件上传问题的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 body-parser中间件,其实“极不完美” —…

    2025年3月7日
    200
  • 浅谈Nodejs关闭进程的方法

    本篇文章和大家一起了解一下node关闭进程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《node》 NodeJS结束进程 Process:对象是一个全局变量,它提供有关当前 Node.js 进程的信息…

    2025年3月7日
    200
  • 分享几种实用的Node.js调试方法,快来收藏吧!!

    本篇文章给大家介绍nodejs调试的几种方式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 第一种 1、打开 vscode 内置终端,右上角选择 JavaScript Debug Ter…

    2025年3月7日 编程技术
    200
  • Nodejs+express中间件实现文件上传

    本篇文章给大家详细介绍nodejs文件上传的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 笔者用nodejs做项目时需要用到文件上传的功能,在网上搜索了很多教程,找到了一个express的中间件,用于处理multi…

    2025年3月7日
    200
  • 详解主动终止Node.js进程的几种方法

    本篇文章给大家介绍一下主动触发node进程终止的一些方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 有几个原因会导致 Node.js 进程终止。其中一些是可以避免的,例如抛出错误时,而另一些是无法防止的,例如内存不足…

    2025年3月7日
    200
  • Node.js中LTS和Current有什么区别

    本篇文章给大家介绍一下node.js中lts和current的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 2016 年 10 月 18 日,Node.js v6 LTS (Boron) 发布,这也是 Node.j…

    2025年3月7日
    200
  • 详解nodejs中的事件循环机制

    本篇文章带大家了解一下node中的事件循环机制。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 前端开发离不开JavaScript,Javascript是一种web前端语言,主要用于web开发中,由浏览器解析执行。而js的…

    2025年3月7日 编程技术
    200
  • 详解vscode中如何更简单、有效地调试Node.js程序!!

    本篇文章给大家介绍一下使用vscode调试node.js的超简单方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐学习:《vscode》、《vscode》 让我们面对现实吧…调试 Node.js 一直是…

    2025年3月7日 编程技术
    200
  • 深入浅析Nodejs中的“洋葱模型”

    本篇文章带大家了解一下nodejs中的“洋葱模型”。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 目前比较流行的 Node.js 框架有Express、KOA和Egg.js,其次是另外一个正在兴起的与 TypeScrip…

    2025年3月7日 编程技术
    200
  • 浅谈Nodejs中的callback回调

    本篇文章给大家介绍一下nodejs中的callback回调。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐学习:《nodejs》 什么是callback?  很显然,字面意思就是回调 那为什么在Node中需要回调操作…

    2025年3月7日
    200

发表回复

登录后才能评论