export default {
list: {}, // 事件中心集中地
/**
* 发布订阅
* @param {string} name 事件名
* @param [...args]
*/
$emit: function (name) {
if (this.list[name]) {
for (let i = 0; i < this.list[name].length; i++) {
this.list[name][i].apply(this, Array.from(arguments).slice(1));
}
}
},
/**
* 订阅一次后取消订阅
* @param {string} name 事件名
* @param {*} fn
*/
$once: function (name, fn) {
function on() {
// 触发一次后移除
fn.apply(this, arguments);
this.$off(name, on);
}
// 加个标识,如一次都没触发的时候也可以手动移除订阅
on.fn = fn;
this.$on(name, on);
},
/**
* 订阅
* @param {string|Array<strig>} name 事件名
* @param {Function} fn
* @returns
*/
$on: function (name, fn) {
// 传入的数组循环调用订阅
if (Array.isArray(name)) {
for (let i = 0; i < name.length; i++) {
this.$on(name[i], fn);
}
return;
}
if (this.list[name]) {
this.list[name].push(fn);
} else {
this.list[name] = [fn];
}
},
/**
* 取消订阅
* @param {string|Array<string>|null} name 事件名
* @param {Function|null} fn
* @returns
*/
$off: function (name, fn) {
// 没传入参数,清空所有订阅
if (!name) {
this.list = {};
return;
}
if (Array.isArray(name)) {
for (let i = 0; i < name.length; i++) {
this.$off(name[i], fn);
}
return;
}
const cbs = this.list[name];
// 没有订阅,直接返回
if (!cbs) return;
// 没有传入对应的订阅,清空所有相关订阅
if (!fn) {
this.list[name] = null;
return;
}
// 找到对应的订阅删除
for (let i = 0; i < cbs.length; i++) {
if (cbs[i] === fn || cbs[i].fn === fn) {
cbs.splice(i, 1);
break;
}
}
}
};
event 用法
$on $on(evnet,callback), $on([evnet,evnet2],callback)
$off $off(), $off(event), $off(event,callback)
$once $once(evnet,callback)
$emit $emit(event), $emit(event,[...args])

html中使用

// 引入
<script type="module">
import bus from './bus.js';
// 挂载到window上
window.$bus = bus;
</script>
<script>
// 用法
// window.$bus.$on(event,callback), 订阅
// window.$bus.$once(event,callback), 订阅一次后移除订阅
// window.$bus.$off(event,callback), 移除订阅
// window.$bus.$emit(event,[...args]), 发布
</script>

vue2中使用

// main.js中引入
import bus from './bus.js';
// 挂在到原型上,创建事件总线
Vue.prototype.$bus = bus; // 用法
// this.$bus.$on(event,callback), 订阅
// this.$bus.$once(event,callback), 订阅一次后移除订阅
// this.$bus.$off(event,callback), 移除订阅
// this.$bus.$emit(event,[...args]), 发布

js中订阅发布模式bus的更多相关文章

  1. js设计模式之代理模式以及订阅发布模式

    为啥将两种模式放在一起呢?因为这样文章比较长啊. 写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系.知识成为个人的知识,就在于能够用自己的话表达同一种意义. 本文是设计模式系列文 ...

  2. Publisher/Subscriber 订阅-发布模式

    Publisher/Subscriber 订阅-发布模式 本博后续将陆续整理这些年做的一些预研demo,及一些前沿技术的研究,与大家共研技术,共同进步. 关于发布订阅有很多种实现方式,下面主要介绍WC ...

  3. AngularJS的简单订阅发布模式例子

    控制器之间的交互方式广播 broadcast, 发射 emit 事件 类似于 js中的事件 , 可以自己定义事件 向上传递直到 document 在AngularJs中 向上传递直到 rootScop ...

  4. 设计模式---订阅发布模式(Subscribe/Publish)

    设计模式---订阅发布模式(Subscribe/Publish) 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有订阅者对象,使 ...

  5. RabbitMQ下的生产消费者模式与订阅发布模式

    所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入   假设 ...

  6. Kafka下的生产消费者模式与订阅发布模式

    原文:https://blog.csdn.net/zwgdft/article/details/54633105   在RabbitMQ下的生产消费者模式与订阅发布模式一文中,笔者以“数据接入”和“事 ...

  7. saltstack系列(三)——zmq订阅/发布模式

    zmq订阅发布模式 server端代码: #coding=utf-8 ''''' 服务端,发布模式 ''' import zmq from random import randrange contex ...

  8. ionic2踩坑之订阅发布模式的实现

    原文地址:http://www.cnblogs.com/eccainiao/p/6429536.html 转载请说明. 在ionic2中实现订阅发布模式,需要用到Events. Events下面有三个 ...

  9. 订阅发布模式eventEmiter

    // 订阅发布模式 class EventEmitter { constructor() { this._events = {}; } on(name, callback) { if (this._e ...

  10. Java里观察者模式(订阅发布模式)

    创建主题(Subject)接口 创建订阅者(Observer)接口 实现主题 实现观察者 测试 总结 在公司开发项目,如果碰到一些在特定条件下触发某些逻辑操作的功能的实现基本上都是用的定时器 比如用户 ...

随机推荐

  1. GaussDB(for MySQL) Serverless全面商用:无感弹性,极致性价比

    本文分享自华为云社区<GaussDB(for MySQL) Serverless全面商用:无感弹性,极致性价比>,作者: GaussDB 数据库. 技术背景 对于现代企业级IT系统,数据库 ...

  2. patch命令

    patch命令 patch指令让用户利用设置修补文件的方式.修改.更新原始文件,倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行,如果配合修补文件的方式则能一次修补大批文件,这也是Linux系 ...

  3. Swoole从入门到入土(1)——入坑

    入坑一个话题,总得有入坑的理由.有好多话题可供选择,但是思来想去,对于PHPer进阶与其急着去掌握一门新的语言,匆忙地踏足一个新的知识体系,还不如先把php圈子的技能点攒齐了. 话说Swoole诞生之 ...

  4. html基础和js基础

    HTML基础 html文件结构 <!DOCTYPE html> 文档类型声明 <html lang="en"></html> 是html标签,称 ...

  5. docker开发

    Docker docker介绍 Docker是一个客户端-服务器(C/S)架构程序.本质上是通过go语言对lxc技术的一个封装,遵守Restful规范 docker hub注册一个账号(用来拉取镜像) ...

  6. 矩池云教程|体验 OpenAI 最近推出的 3D 生成模型 Shap-E!

    Shap-E 是由 OpenAI 最近推出的3D生成模型,使用者可以通过简单的文字或图像进行三维模型的生成,OpenAI 认为相比于点云的生成模型Point-E,Shap-E的收敛更快.本文将展示如何 ...

  7. 如何在矩池云使用 Poetry 管理项目环境

    官网介绍:Poetry is a tool for dependency management and packaging in Python. It allows you to declare th ...

  8. C C++结构体四种方式

    第一种语法表示 struct 结构体名称 {     数据类型 member1:     数据类型 member2;  };  #include<iostream> using names ...

  9. DataGear 制作折柱图数据可视化图表

    利用 DataGear  看板的 自定义图表选项 功能,可以很方便地制作折柱图(或者折线-饼图.柱状-饼图)数据可视化图表. 假设有如下CSV数据集,包括名称和两个指标值数据: 名称, 指标0, 指标 ...

  10. 【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)

    问题描述 Azure API Management 是否可以通过请求中的Path来限定其被访问的频率? 在系统Request中发现某个Path 在短时间内被频繁的调用,影响了后台服务的性能及安全,所以 ...