首页前端开发JavaScriptNode.js学习之聊聊Events模块

Node.js学习之聊聊Events模块

时间2024-01-31 03:19:03发布访客分类JavaScript浏览818
导读:收集整理的这篇文章主要介绍了Node.js学习之聊聊Events模块,觉得挺不错的,现在分享给大家,也给大家做个参考。本篇文章带大家了解一下Node.js中的Events模块,介绍一下 Events 中的发布订阅模式,希望对大家有所帮助!E...
收集整理的这篇文章主要介绍了Node.js学习之聊聊Events模块,觉得挺不错的,现在分享给大家,也给大家做个参考。本篇文章带大家了解一下Node.js中的Events模块,介绍一下 Events 中的发布订阅模式,希望对大家有所帮助!

Events模块

参考官网:events 事件触发器 | Node.js

http://nodejs.cn/api/events.htML

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 方法。

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

以上就是Node.js学习之聊聊Events模块的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: 带你聊聊JavaScript中的回调函数...下一篇:数据结构的学习之使用JavaScript...猜你在找的JavaScript相关文章 html font标签如何设置字体大小?html font标签属性用法介绍2022-05-16vue3+TypeScript+vue-router的使用方法2022-04-16vue3获取当前路由地址2022-04-16如何利用React实现图片识别App2022-04-16JavaScript展开运算符和剩余运算符的区别详解2022-04-16微信小程序中使用vant框架的具体步骤2022-04-16Vue elementUI表单嵌套表格并对每行进行校验详解2022-04-16如何利用Typescript封装本地存储2022-04-16微信小程序中wxs文件的一些妙用分享2022-04-16JavaScript的Set数据结构详解2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: Node.js学习之聊聊Events模块
本文地址: https://pptw.com/jishu/593411.html
JavaScript事件之事件冒泡与时间捕获(总结分享) c语言如何实现选择排序算法(代码示例)

游客 回复需填写必要信息