【常见面试题】JS 发布者、订阅者模式

面试中经常出现问到如何实现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、如下是打印结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 控制语句(二)

一 break continue和goto语句 1 break语句 在switch语句中,分隔case子句,跳出switch语句。 在循环语句中可以立即终止循环语句的执行。 2 continue语句 功能:在一次循环过程中,跳过continue语句以下的语句,直 接进入下一次循环操作。 3 goto语句 …

软考98-上午题-【信息安全】-防火墙

一、考试概述 该内容与计算机网络关联。 分值:2分 二、防火墙 防火墙 (Firewall) 是建立在内外网络边界上的过滤封锁机制,它认为内部网络是安全和可信赖的,而外部网络是不安全和不可信赖的。 防火墙的作用是防止不希望的、未经授权地进出…

CCF-CSP认证考试 202303-5 施肥 35/60/75/100分题解

更多 CSP 认证考试题目题解可以前往:CSP-CCF 认证考试真题题解 原题链接: 202303-5 施肥 时间限制: 2.0s 内存限制: 1.0GB 问题描述 春天到了,西西艾弗岛上的 n n n 块田地需要施肥了。 n n n 块田地编号为 1 , 2…

Qt消息机制和事件

Qt消息机制和事件 Qt消息机制和事件--2 事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出&…

【数据结构】顺序表的实现——静态分配

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

matplotlib画图:子图中坐标轴与标题重合...

如下图 只要在代码最后加入 plt.tight_layout() 就可以自动调节

江苏开放大学2024年春《市政管理学050011》第一次形考作业参考答案

答案:更多答案,请关注【电大搜题】微信公众号 答案:更多答案,请关注【电大搜题】微信公众号 答案:更多答案,请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库,支持文字、图片搜题…

C语言编译和链接理解

一. 翻译环境和运行环境 二. 翻译环境:预编译编译汇编链接 三运行环境 一. 翻译环境和运行环境 : 1.翻译环境和运行环境:在ANSI C的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为…

散热风扇220v交流12v直流12038轴流风机配电箱机柜散热风扇15050

品牌:威驰 颜色分类:11025风扇220v含油,11025风扇220v纯铜双滚珠,12025风扇220v含油,12025风扇220v纯铜双滚珠,12025风扇24V纯铜双滚珠,12025风扇12V纯铜双滚珠,12038风扇220v含油,12038风扇110V含油,12038风扇220v纯铜双滚珠,12038风扇110v纯铜双滚珠,…

如何把PNG图片转换成CAD图纸DWG格式

环境: CAD2021 PNG图片 问题描述: 如何把PNG图片转换成CAD图纸DWG格式 解决方案: 将PNG图像转换为CAD文件(如DXF或DWG格式)是设计和工程领域中常见的需求之一。幸运的是,有几种工具和软件可以帮助完成…

幻兽帕鲁服务器多少钱?2024年Palworld服务器价格整理

2024年全网最全的幻兽帕鲁服务器租用价格表,阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月,阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全: 阿里云幻…

Java异常机制

异常体系图 Throwable Throwable 是 Java 语言中所有错误与异常的超类。 Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。 Throwable 包含了其线程创建时线程执…

计算机组成原理 浮点数溢出

阶码同样有位数限制 浮点数的溢出并不以尾数溢出来判断,尾数溢出可以通过右规操作得到纠正。运算结果是否溢出主要看结果的指数是否发生了上溢,因此是由指数上溢来判断的。可能导致溢出的情况:即所有涉及阶码运算的情况 右规和尾数舍入&…

HBase Shell基本操作

一、进入Hbase Shell客户端 先在Linux Shell命令行终端执行start-dfs.sh脚本启动HDFS,再执行start-hbase.sh脚本启动HBase。如果Linux系统已配置HBase环境变量,可直接在任意目录下执行hbase shell脚本命令,就可进入HBase Shell的命令行终端环…

【JavaWeb】Day22.maven安装介绍

目录 一.初识Maven 什么是maven? Maven的作用 二.Maven概述 1. Maven介绍 2.Maven模型 3. Maven仓库 三. Maven安装 1.下载 2. 安装步骤 1. 解压安装 2. 配置本地仓库 3.配置阿里云私服 4. 配置Maven环境变量 一.初识Maven 什么是maven? Maven是apache旗下的一个…

2024年数字IC秋招-复旦微电子-数字前端/验证-笔试题

文章目录 前言一、基础题/选做题1、什么是DMA,主要优点是什么,为什么这是它的优点2、SV的代码如下,给出$display中变量的值3、列出4bit格雷码编码,画出二进制码转格雷码电路图4、如何从慢时钟域捕获快时钟域脉冲信号,画…

行为管理设置能监控或者检测哪些东西

3 月 27 日,国新办举行“推动高质量发展”系列主题新闻发布会,浙江省省长王浩:全省市场经营主体 1040 万户,相当于平均每 6.5 个浙江人就有 1 个老板。 不由让小编想到,这么多老板,那么老板创办企业也怪不容…

蓝桥杯省三保底代码——数显+按键功能实现

目录 前言 一、为什么能保底省三 二、数显模块的实现 1.数码管显示​编辑 1)断码表 2)位选 3)段选 4)扫描 2.菜单 三、按键功能的实现 1.按键扫描 2.菜单切换 四、完整代码演示 五、结语 前言 上一期介绍全家桶时&…

【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)

文章目录 ⭐容器继承关系&#x1f339;Set容器&#x1f5d2;️HashSet源码解析构造方法public HashSet()public HashSet(Collection<? extends E> c)public HashSet(int initialCapacity, float loadFactor)HashSet(int initialCapacity, float loadFactor, boolean dum…

OpenHarmony实战开发-Web组件的使用

介绍 本篇Codelab使用ArkTS语言实现一个简单的免登录过程&#xff0c;向大家介绍基本的cookie管理操作。主要包含以下功能&#xff1a; 获取指定url对应的cookie的值。设置cookie。清除所有cookie。免登录访问账户中心。 原理说明 本应用旨在说明Web组件中cookie的管理操作。…