591 内置模块events

3.1. 基本使用

Node中的核心API都是基于异步事件驱动的:

  • 在这个体系中,某些对象(发射器(Emitters))发出某一个事件;
  • 我们可以监听这个事件(监听器 Listeners),并且传入的回调函数,这个回调函数会在监听到事件时调用;

发出事件和监听事件都是通过EventEmitter类来完成的,它们都属于events对象。

  • emitter.on(eventName, listener):监听事件,也可以使用addListener
  • emitter.off(eventName, listener):移除事件监听,也可以使用removeListener
  • emitter.emit(eventName[, ...args]):发出事件,可以携带一些参数;
const EventEmmiter = require('events');

// 监听事件
const bus = new EventEmmiter();

function clickHanlde(args) {
  console.log("监听到click事件", args);
}

bus.on("click", clickHanlde);

setTimeout(() => {
  bus.emit("click", "hahaha");
  bus.off("click", clickHanlde);
  bus.emit("click", "kobe");
}, 2000);

01_events基础方法.js

const EventEmitter = require("events");

// 1.创建发射器
const emitter = new EventEmitter();

// 2.监听某一个事件
// addListener是on的alias简写
emitter.on('click', (args) => {
  console.log("监听1到click事件", args);
})

const listener2 = (args) => {
  console.log("监听2到click事件", args);
}

emitter.on('click', listener2)

// 3.发出一个事件
setTimeout(() => {
  emitter.emit("click", "hahaha", "james", "kobe");
  emitter.off("click", listener2);
  emitter.emit("click", "hahaha", "james", "kobe");
}, 2000);

3.2. 常见的属性

EventEmitter的实例有一些属性,可以记录一些信息:

  • emitter.eventNames():返回当前 EventEmitter对象注册的事件字符串数组;
  • emitter.getMaxListeners():返回当前 EventEmitter对象的最大监听器数量,可以通过setMaxListeners()来修改,默认是10;
  • emitter.listenerCount(事件名称):返回当前 EventEmitter对象某一个事件名称,监听器的个数;
  • emitter.listeners(事件名称):返回当前 EventEmitter对象某个事件监听器上所有的监听器数组;
console.log(bus.eventNames());
console.log(bus.getMaxListeners());
console.log(bus.listenerCount("click"));
console.log(bus.listeners("click"));

02_events获取信息.js

const EventEmitter = require('events');

// 1.创建发射器
const emitter = new EventEmitter();

// 2.监听某一个事件
// addListener是on的alias简写
emitter.on('click', (args) => {
  console.log("监听1到click事件", args);
})

const listener2 = (args) => {
  console.log("监听2到click事件", args);
}
emitter.on('click', listener2)

emitter.on("tap", (args) => {
  console.log(args);
})

// 3.获取注册的事件
console.log(emitter.eventNames());
console.log(emitter.listenerCount("click"));
console.log(emitter.listeners("click"));

3.3. 方法的补充

emitter.once(eventName, listener):事件监听一次

const EventEmitter = require('events');

const emitter = new EventEmitter();

emitter.once('click', (args) => {
  console.log("监听到事件", args);
})

setTimeout(() => {
  emitter.emit('click', 'hahaha');
  emitter.emit('click', 'hahaha');
}, 2000);

emitter.prependListener():将监听事件添加到最前面

emitter.on('click', (args) => {
  console.log("a监听到事件", args);
})

// b监听事件会被放到前面
emitter.prependListener("click", (args) => {
  console.log("b监听到事件", args);
})

emitter.prependOnceListener():将监听事件添加到最前面,但是只监听一次

emitter.prependOnceListener("click", (args) => {
  console.log("c监听到事件", args);
})

emitter.removeAllListeners([eventName]):移除所有的监听器

// 移除emitter上的所有事件监听
emitter.removeAllListeners();
// 移除emitter上的click事件监听
emitter.removeAllListeners("click");

03_events不常用方法.js

const EventEmitter = require("events");

// 1.创建发射器
const emitter = new EventEmitter();

// 2.监听某一个事件
// addListener是on的alias简写
// 只执行一次
emitter.once('click', (arg1, arg2, arg3) => {
  console.log("监听1到click事件", arg1, arg2, arg3);
})

const listener2 = function(arg1, arg2, arg3) {
  // 特点: 绑定this, 也不绑定arguments数组
  console.log(arguments);
  console.log(this);
  console.log("监听2到click事件", arg1, arg2, arg3);
}

emitter.on('click', listener2)

// 将本次监听放到最前面
emitter.prependListener('click', (arg1, arg2, arg3) => {
  console.log("监听3到click事件", arg1, arg2, arg3);
})

emitter.on("scroll", (args) => {
  console.log("监听到scroll方法");
})


// 3.发出一个事件
setTimeout(() => {
  // emitter.removeAllListeners("click");
  emitter.emit("click", "hahaha", "james", "kobe");
  emitter.emit("click", "hahaha", "james", "kobe");
  emitter.emit("scroll", "hahaha", "james", "kobe");
}, 2000);

console.log(arguments);
console.log(this);

posted on 2021-01-29 09:06  冲啊!  阅读(83)  评论(0编辑  收藏  举报

导航