2024,还没掌握 JS 发布者、订阅者模式吗

news2024/11/27 7:43:20

面试中经常出现问到如何实现JS 发布者、订阅者模式。下面是ES5实现发布订阅模式。

1、直接上代码。

function EventEmitter() {
    this.events = {};
};
// 订阅者
EventEmitter.prototype.on = function(ename, callback) {
    if (!this.events[ename]) {
        // 初始化创建订阅,一个订阅名可以创建多个时间函数
        this.events[ename] = [callback];
    } else {
        // 订阅已存在,push指定订阅名称尾部
        this.events[ename].push(callback);
    }
}
// 发布者
EventEmitter.prototype.emit = function(ename) {
    // 遍历执行订阅名称下的所有订阅者事件
    this.events[ename] && this.events[ename].forEach(cb => {
        // 执行订阅者函数
        cb();
    });
}
// 发布者
EventEmitter.prototype.off = function(ename, callback) {
    if (this.events[ename]) {
        // this.events[ename] && this.events[ename].filter(cb => cb != callback)
        // console.log('this.events', this.events)
        const targetIndex = this.events[ename].findIndex(cb => cb === callback)
        if (targetIndex !== -1) {
            this.events[ename].splice(targetIndex, 1)
        }
        if (this.events[ename].length === 0) {
            delete this.events[ename]
        }
    }
}
// 只执行一次订阅发布,然后移除
EventEmitter.prototype.once = function(ename, callback) {
    var that = this;
    var fn = function() {
        callback();
        that.off(ename, fn);
    }
    this.on(ename, fn);
}


// 实例化构造函数
var em = new EventEmitter();

em.on("work", function() {
    console.log('work,订阅发布成功');
});

var makeOnce = function() {
    console.log("money,移除");
}
em.on("money", makeOnce);

em.once("love", function() {
    console.log("love,仅一次");
});

em.emit("work");
em.off("money", makeOnce);
em.emit("money"); // 移除后,无法发布
em.emit("love"); 
em.emit("love"); // 只执行一次,再次将不再执行

2、如下是打印结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法训练营第二十一天(二叉树part7)

算法训练营第二十一天(二叉树part7) 530.二叉搜索树的最小绝对差 力扣题目链接(opens new window) 题目 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例: 提示:树中至…

9.枚举类与注解

文章目录 1. 枚举类1.1 自定义枚举类1.2 enum关键字定义枚举类1.3 Enum类主要方法 2. 注解2.1 注解作用2.1.1 生成文档相关注解2.1.2 JDK内置基本注解-在编译时进行格式检查2.1.3 跟踪代码依赖性,实现替代配置文件功能 2.2 自定义Annotation2.3 JDK中的元注解2.3.1 …

Python零基础从小白打怪升级中~~~~~~~流程控制语句

第三节:Python的流程控制语法 一、Python条件语句的语法 if 条件1:条件1成立执⾏的代码一条件1成⽴执⾏的代码二...... elif 条件2:条件2成立执⾏的代码三条件2成立执⾏的代码四...... ...... else:以上条件都不成⽴,执行的代码五以上条件都…

海外盲盒系统开发,盲盒出口成为企业新机遇

随着盲盒的兴起,国内消费市场形成了万物皆可盲盒的态势。并且,盲盒自带社交属性,也成为了年轻人的社交神器。 除了在国内,盲盒在海外也掀起了一股热潮,呈现出了爆发式增长形势,国内热门盲盒企业也出口到了…

Redis的三种部署方案

文章目录 单机模式主从复制哨兵模式分片集群 在Redis中提供的集群方案总共有三种:单机模式,主从复制集群、哨兵模式,Redis分片集群 单机模式 Redis 只运行在一台服务器上,并且所有的数据都存储在这一台服务器的内存中。 主从复制…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

黄金白银价格上涨是投资机会吗?

黄金和白银,作为历史悠久的贵重金属,一直以来都被投资者视为避险资产。近年来,随着全球经济环境的变动,我们观察到黄金与白银的价格不断攀升,这是否预示着投资机会的到来?今天,就让我们来深度探…

【保姆级讲解SQL Server的详细使用教程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

ATG-2021B功率信号源可以应用在哪些方面

功率信号源是一种能够产生一定功率的信号源,广泛应用于各个领域。下面将介绍功率信号源在电子、通信、工业和科研等方面的应用。 在电子行业中,功率信号源是一种重要的测试工具。它可以产生各种波形的信号,如正弦波、方波、脉冲波等&#xff…

vue中实现表格的局部刷新

背景: 列表中展示所有审核任务信息,包括审核状态、审核进度等,原来的实现是【查询】按钮绑定了一个定时器,定时查询整个列表,但是需要用户手动开启 领导觉得这种方式用户体验不好,希望能够实现【审核进度…

Golang | Leetcode Golang题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…

人工智能支持节能的七种方式

2024年2月&#xff0c;OpenAI公布了名为“Sora”的人工智能模型。从去年的chatgpt到今天Sora发布&#xff0c;OpenAI的每⼀次重要的动作和发布&#xff0c;都伴随着⼀场场精妙绝伦精巧的事件营销&#xff0c;它的设置议题的能⼒&#xff0c;节奏控制&#xff0c;公众引导堪称创…

P1731 [NOI1999] 生日蛋糕——典型的回溯和剪枝题目,值得一看

今天尝试了一下md的编辑器&#xff0c;不知道有没有什么改变 [NOI1999] 生日蛋糕 题目背景 数据加强版 link 题目描述 7 月 17 日是 Mr.W 的生日&#xff0c;ACM-THU 为此要制作一个体积为 N π N\pi Nπ 的 M M M 层生日蛋糕&#xff0c;每层都是一个圆柱体。 设从下往…

node后端上传文件到本地指定文件夹

实现 第一步&#xff0c;引入依赖 const fs require(fs) const multer require(multer) 第二步&#xff0c;先设置一个上传守卫&#xff0c;用于初步拦截异常请求 /*** 上传守卫* param req* param res* param next*/ function uploadFile (req, res, next) {// dest 值…

GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件

2.16 火焰传感器 红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源&#xff0c;在机器人比赛中&#xff0c;远红外火焰探头起到非常重要的作用&#xff0c;它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人等。 红外火焰传感器…

10-热点文章-定时计算

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大 问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 …

R语言数据操纵:常用函数

目录 处理循环的函数 lapply函数 apply函数 mapply函数 tapply函数 split函数 排序的函数 sort函数与order函数 总结数据信息的函数 head函数与tail函数 summary函数 str函数 table函数 any函数 all函数 xtab函数 object.size函数 这篇文章主要介绍R语言中处理…

全网最全的APP测试面试题(含文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f…

Windows的“上帝模式”

Windows操作系统,以其强大的功能和广泛的兼容性深受全球用户喜爱。然而,随着系统功能的日益丰富,许多深度设置和管理选项可能隐藏在层层菜单之下,不易被普通用户迅速找到。为了简化这一过程,微软在Windows Vista之后的版本中引入了一项鲜为人知但极为实用的功能——“上帝…

鸿蒙千帆起~ 是转?还是留?

近期鸿蒙系统相关行业热度一度高涨&#xff0c;像今天2024年1月18日 鸿蒙OS Next开发者预览版正式发布引起了不少业内人士关注&#xff0c;再度冲上了热榜。余承东老余之前就说过2024年是鸿蒙关键的一年&#xff0c;从这句话就可以看出后一定有大的动作。 就像去年有业内人士网…