NodeJs简明教程(7)

NodeJs简明教程将从零开始学习NodeJs相关知识,助力JS开发者构建全栈开发技术栈!微信

本文是NodeJs简明教程的第七篇,将介绍NodeJs events模块相关的基本操做。架构

大多数 Node.js 核心 API 构建于惯用的异步事件驱动架构,其中某些类型的对象(又称触发器,Emitter)会触发命名事件来调用函数(又称监听器,Listener)。异步

快速开始

使用事件监听器通常包含如下操做:函数

  1. 新建事件监听器实例
  2. 设置监听函数
  3. 触发事件
const EventEmitter = require('events'); // 引用模块

class MyEmitter extends EventEmitter {} // 初始化监听器

const myEmitter = new MyEmitter();

myEmitter.on('event', () => { // 设置监听函数
  console.log('an event occurred!');
});

myEmitter.emit('event'); // 触发事件
复制代码

以上例程会输出an event occurred!学习

一次性事件监听

上文中的监听方式事件触发几回就会输出几回an event occurred!,有些事件多是一次性的。这时候能够使用once监听。ui

const EventEmitter = require('events'); // 引用模块

class MyEmitter extends EventEmitter {} // 初始化监听器

const myEmitter = new MyEmitter();

myEmitter.once('event', () => { // 设置监听函数
  console.log('an event occurred!');
});

myEmitter.emit('event'); // 触发事件
myEmitter.emit('event'); // 触发事件
复制代码

以上例程会输出1次 an event occurred!;spa

同一事件屡次监听

上文中的监听方式都是只有1个监听函数,经过屡次调用on能够设置多个监听函数。code

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', () => { // 监听器1
  console.log('监听器1收到事件');
});

myEmitter.on('event', () => { // 监听器2
  console.log('监听器2收到事件');
})

myEmitter.emit('event'); // 触发事件
复制代码

以上例程会输出cdn

监听器1收到事件
监听器2收到事件
复制代码

接收事件参数

  1. emit函数的第一个值为事件名,后续参数为事件值
  2. ononce等监听器设置函数的回调函数收到的值为emit传入的事件参数
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', (param1,param2,param3) => { // 接收事件参数
  console.log('收到事件',param1,param2,param3);
});

myEmitter.emit('event','参数1','参数2',{name:'参数3'}); // 发送事件参数
复制代码

以上例程会输出对象

收到事件 参数1 参数2 { name: '参数3' }
复制代码

获取事件监听器上全部事件

使用eventNames()实例方法获取监听器上全部事件

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', (param1,param2,param3) => {
  console.log('收到事件',param1,param2,param3);
});

myEmitter.once('event2',() => {
  console.log('收到事件2');
});

console.log(myEmitter.eventNames());
复制代码

以上例程输出[ 'event', 'event2' ]

移除事件监听器

使用off实例方法移除单个监听器

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

const callback = (param1) => {
  console.log(param1);
};

myEmitter.on('event', callback); // 添加监听器

myEmitter.off('event', callback); // 移除监听器

myEmitter.emit('event'); // 触发事件
复制代码

以上例程没有输出,由于先添加监听器,随后移除,触发事件时已经没有可用的监听器了

移除全部监听器

使用removeAllListeners([eventName])实例方法移除全部监听器

  1. removeAllListener不传参数时移除该emitter实例全部事件监听器
  2. removeAllListener传入字符串参数时移除该emitter实例全部该事件的监听器

结语

事件系统是NodeJs的灵魂,在几乎全部的I/O模块都有使用,但愿各位读者好好掌握。事件模块读后有疑问请加微信群讨论。

微信群
相关文章
相关标签/搜索