首页 >

Node.js学习之聊聊Events模块

web前端|js教程Node.js学习之聊聊Events模块
Node.js,Events模块
web前端-js教程
本篇文章带大家了解一下Node.js中的Events模块,介绍一下 Events 中的发布订阅模式,希望对大家有所帮助!
音乐相册源码免费,vscode运行没有显示,ubuntu 书 推荐,Tomcat并发返回慢,qt创建sqlite3表,爬虫会不会把服务器崩,php 引号嵌套,知乎专栏文章seo,云播放怎么下载电影网站源码,去哪里下载网页模板lzw
在线源码获查看,vscode字体哪个好看,ubuntu 查看ip,tomcat7数据源配置,数据库的表怎么放到sqlite,余姚学网页设计,百度云数据库php连接,商超如何做好服务器,移动端jq商品分类插件,简单上手的纯前端框架软件,爬虫窃取,php type,seo密度,springboot仓库地址,标签广告样本,html源码网站,h5宣传网页源码,phpcms v9 模板教程,建站之星默认后台,电商开源页面,软件bug管理系统,c 程序头lzw

Events模块
mmo服务器 java源码,ubuntu 高仿mac,爬虫代理IP提取,php放在,seo sem优化lzw
Events 模块是Node最重要的模块,它提供了一个属性 EventEmitterEventEmitter 的核心是事件发射与事件监听器。

Node中大部分的模块,都继承自 Events 模块。

Events 模块是Node对 发布订阅模式publish/subscribe)的实现。一个对象通过这个模块,向另一个对象传递消息。该模块通过 EventEmitter 属性,提供了一个构造函数。该构造函数的实例具有 on 方法,可以用来监听指定事件,并触发回调函数。任意对象都可以发布指定事件,被 EventEmitter 实例的on方法监听到。

发布订阅模式

关于 Events 中的发布订阅模式,我们要先清楚它的几个常用方法。

订阅方法on 方法用来订阅事件,订阅是将方法对应成一种一对多的关系。发布方法emit 用来执行订阅的事件。取消订阅off 方法可以移除对应的事件监听。订阅一次once 绑定事件当执行后自动删除订阅的事件。

on 和 emit

on 方法的第一个参数用来设定类名,第二个参数也是一个函数,里面可以接收发布时传入的参数。

emit 方法第一个参数是类名,之后的参数都是传入 on 方法函数中的参数。

onemit 具体应用可以参考下面这个简单的Demo。

const EventEmitter = require('events');// 自定义一个 构造函数function Cat() {}// 原型继承 需要通过实例来调用继承方法Object.setPrototypeOf(Cat.prototype, EventEmitter.prototype);let cat = new Cat();const sleep = (a, b) => {    console.log(a, '睡');};const eat = (a, b) => {    console.log(b, '吃');};cat.on('猫咪', sleep)cat.on('猫咪', eat)setTimeout(() => {  	// 小胡子 吃  	// 小胖仙 睡    cat.emit('猫咪', '小胖仙', '小胡子')}, 1000);

现在我们可以实现一套 onemit 方法。

function EventEmitter() {    this._event = {}}// on 方法EventEmitter.prototype.on = function (eventName, callBack) {    if (!this._event) {        this._event = {}    }    if (this._event[eventName]) {        this._event[eventName].push(callBack) // 相当于 {eventName:[fn1,fn2]}    } else {        this._event[eventName] = [callBack]; // 相当于 {eventName:[fn1]}    }}// emit 方法EventEmitter.prototype.emit = function (eventName, ...args) {    this._event[eventName].forEach(fn => {        fn(...args)    });}

off

off 方法的第一个参数用来设定类名,第二个参数传入需要被移除的函数回调。

// ...setTimeout(() => {  	// 小胡子 吃  	// 小胖仙 睡    cat.emit('猫咪', '小胖仙', '小胡子')  	cat.off('猫咪', sleep);  	// 小胡子 吃    cat.emit('猫咪', '小胖仙', '小胡子')}, 1000);

这样我们可以大概判断出来,移除掉和我们传入函数相同的函数,我们很快想到 filter 方法。

// off 方法EventEmitter.prototype.off = function (eventName, callBack) {    if (this._event && this._event[eventName]) {        this._event[eventName] = this._event[eventName].filter(          fn => fn !== callBack && fn.c !== callBack // fn.c参考下面的once方法实现        )    }}

once

once 方法的第一个参数用来设定类名,第二个参数传入只需要执行一次的函数回调。

// ...const demolition =() => {    console.log('拆家');}cat.once('猫咪', demolition)setTimeout(() => {  	// ...... 拆家    cat.emit('猫咪', '小胖仙', '小胡子')}, 1000);

这样我们可以根据之前实现的 onoff 来实现此方法。

// once 方法EventEmitter.prototype.once = function (eventName, callBack) {    const one = () => {        callBack();        this.off(eventName, one);    }    this.on(eventName, one);}

看起来这个方法好像没有什么问题,执行起来也全都是正确的。

但是在一种特殊情况下的时候,还是出现了错误。

那种情况就是如果我们在执行 once 方法之前,就已经通过 off 方法将其移除了。

我们实现的方法就不能实现这个需求了,所以我们还需要对 once 方法进行一些修改 off 方法已经处理过了)

添加一个自定义属性,用来对函数进行 “缓存” 。

EventEmitter.prototype.once = function (eventName, callBack) {    const one = () => {        // ...    }    one.c = callBack; // 自定义一个属性    // ...}

这样我们就实现了 once 方法。

nodejs 教学!!


Node.js学习之聊聊Events模块
  • 深入浅析nodejs中的events模块
  • 深入浅析nodejs中的events模块 | 深入浅析nodejs中的events模块 ...