详解Node.js中的事件

详解Node.js中的事件

相关推荐:《nodejs 教程》

前端对事件肯定不陌生,为 window 绑定 scroll 事件

window.addEventListener('scroll', ev => {console.log(ev);});

登录后复制

Node.js 大部分异步操作使用事件驱动,所有可以触发事件的对象都继承了 EventEmitter 类

事件监听

on

Node.js 事件监听使用和 jQuery API 非常类似emitter.on(eventName, listener)

const ee = new EventEmitter();ee.on('foo', () => console.log('a'));

登录后复制EventEmitter 实例会维护一个 listener 数组,每次 listener 默认会被添加到数组尾部每次添加 listener 不会检查是否添加过,多次调用 on 传入相同的 eventName 和 listener,会导致 listener 被添加多次

prependListener

emitter.prependListener(eventName, listener) 
通过 prependListener 可以把 listener 添加到 listener 数组头部

const ee = new EventEmitter();ee.prependListener('foo', () => console.log('a'));

登录后复制

once

如果希望 listener 被触发一次后就不再触发,可以使用 once 来绑定事件

const ee = new EventEmitter();ee.once('foo', () => console.log('a'));

登录后复制

事件触发

emitter.emit(eventName[, …args])
在浏览器环境中开发者事件相关的大部分工作是订阅事件,也就是绑定事件处理函数 listener,在 Node.js 事件编程中经常需要创建事件对象,在合理实际触发事件。使用 emit 方法可以按照 listener 注册的顺序,同步地调用每个注册到名为 eventName 的事件的监听器,并传入提供的参数

const EventEmitter = require('events');const myEmitter = new EventEmitter();// 第一个监听器。myEmitter.on('event', function firstListener() {  console.log('第一个监听器');});// 第二个监听器。myEmitter.on('event', function secondListener(arg1, arg2) {  console.log(`第二个监听器中的事件有参数 ${arg1}、${arg2}`);});// 第三个监听器myEmitter.on('event', function thirdListener(...args) {  const parameters = args.join(', ');  console.log(`第三个监听器中的事件有参数 ${parameters}`);});console.log(myEmitter.listeners('event'));myEmitter.emit('event', 1, 2, 3, 4, 5);// Prints:// [//   [Function: firstListener],//   [Function: secondListener],//   [Function: thirdListener]// ]// 第一个监听器// 第二个监听器中的事件有参数 1、2// 第三个监听器中的事件有参数 1, 2, 3, 4, 5

登录后复制

this 指向

eventEmitter.emit() 方法可以传任意数量的参数到 listener, this 关键词会被指向 listener 所绑定的 EventEmitter 实例

const myEmitter = new MyEmitter();myEmitter.on('event', function(a, b) {  console.log(a, b, this, this === myEmitter);  // 打印:  //   a b MyEmitter {  //     domain: null,  //     _events: { event: [Function] },  //     _eventsCount: 1,  //     _maxListeners: undefined } true});myEmitter.emit('event', 'a', 'b');

登录后复制

也可以使用 ES6 的箭头函数作为监听器。但 this 关键词不会指向 EventEmitter 实例:

const myEmitter = new MyEmitter();myEmitter.on('event', (a, b) => {  console.log(a, b, this);  // 打印: a b {}});myEmitter.emit('event', 'a', 'b');

登录后复制

异步调用

EventEmitter 以注册的顺序同步地调用所有 listener,这样可以确保事件的正确排序,listener 可以使用 setImmediate() 和 process.nextTick() 方法切换到异步的操作模式

const myEmitter = new MyEmitter();myEmitter.on('event', (a, b) => {  setImmediate(() => {    console.log('异步地发生');  });});myEmitter.emit('event', 'a', 'b');

登录后复制

事件卸载

Node.js 提供了几种卸载事件绑定的方法

off/removeListener

off 方法是 removeListener 方法的别名,用于清理事件绑定 emitter.removeListener(eventName, listener)

const callback = (stream) => {  console.log('已连接');};server.on('connection', callback);// ...server.removeListener('connection', callback);

登录后复制

removeListener() 最多只会从监听器数组中移除一个监听器。 如果监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener() 才能移除所有实例

removeAllListeners

emitter.removeAllListeners([eventName]) 
移除指定的 eventName 事件的 listener,如果没有指定 eventName,则移除事件对象的所有 listener。可以通过 emitter.eventNames() 获取事件对象上的 eventName 数组

const EventEmitter = require('events');const myEE = new EventEmitter();myEE.on('foo', () => {});myEE.on('bar', () => {});myEE.eventNames().forEach(eventName => myEE.removeAllListeners);

登录后复制

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

以上就是详解Node.js中的事件的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月7日 22:44:13
下一篇 2025年3月7日 22:44:21

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

相关推荐

  • 了解Node.js中的process对象

    相关推荐:《node js教程》 process 对象是一个全局变量,是一个 EventEmitter 实例,提供了当前 Node.js 进程的信息和操作方法 系统信息 process 对象提供了属性用于返回关键系统信息,常用的有 titl…

    2025年3月7日
    200
  • 提示Node应用性能的5个技巧

    相关推荐:《node js教程》 “如果你的 node 服务器前面没有 nginx, 那么你可能做错了。”— Bryan Hughes Node.js 是使用 最流行的语言— JavaScript 构建服务器端应用的领先工具 。由于可以同时…

    2025年3月7日
    200
  • 了解Node.js中的定时器

    相关推荐:《node js教程》 timer 用于安排函数在未来某个时间点被调用,Node.js 中的定时器函数实现了与 Web 浏览器提供的定时器 API 类似的 API,但是使用了事件循环实现,Node.js 中有四个相关的方法 set…

    2025年3月7日
    200
  • 谈谈Node.js中的文件写入

    本篇文章给大家介绍一下node.js中的文件写入。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《node js教程》 看完文件读取再看文件写入非常简单,两者的操作几乎一一对应 fs.writeFile fs.…

    2025年3月7日
    200
  • 了解nodejs中的事件和事件循环

    相关推荐:《nodejs 教程》 熟悉javascript的朋友应该都使用过事件,比如鼠标的移动,鼠标的点击,键盘的输入等等。我们在javascript中监听这些事件,从而触发相应的处理。 同样的nodejs中也有事件,并且还有一个专门的e…

    2025年3月7日
    200
  • 浅谈node连接mysql数据库的方法

    本篇文章和大家聊聊node连接mysql数据库的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《node js教程》 node使用原生方式,连接mysql数据库 (async () => { // …

    2025年3月7日
    200
  • nodejs怎么实现对图片进行批量裁剪?

    nodejs怎么实现对图片进行批量裁剪?下面本篇文章给大家介绍一下nodejs实现批量裁剪图片功能的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 1、初始化 首先新建一个 tail…

    2025年3月7日
    200
  • 了解HTTP事务、Node模块化规范

    相关推荐:《nodejs 教程》 HTTP事务: 首先、HTTP事务描述得是一次完整的从请求到响应的过程: 用户发起请求时,首先进行域名解析拿到域名所对应的 IP 地址之后,通过 TCP 协议建立与服务端的通信连接。( 三次握手,建立连接 …

    2025年3月7日 编程技术
    200
  • 两种升级nodejs的方法介绍

    nodejs怎么升级?下面本篇文章给大家介绍nodejs升级的两种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 方法一: 用n升级nodejs # 全局安装n$ npm insta…

    2025年3月7日
    200
  • javascript、Node.js和npm之间有什么关系

    相关推荐:《node js教程》 1、Node.js是什么? Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用’事件驱动’和’非阻塞’模型而得以…

    2025年3月7日
    200

发表回复

登录后才能评论