hn-failte's blog hn-failte's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
    • 小程序
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
    • 圆角边框锯齿问题
    • 各国语言正则
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hn-failte

前端cv仔
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
    • 小程序
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
    • 圆角边框锯齿问题
    • 各国语言正则
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Webpack

  • React

  • JavaScript

    • new命令原理
    • ES5面向对象
    • ES6面向对象
    • 多种数组去重性能对比
    • JS随机打乱数组
    • 判断是否为移动端浏览器
    • 将一维数组按指定长度转为二维数组
    • 防抖与节流函数
    • JS获取和修改url参数
    • 比typeof运算符更准确的类型判断
    • 三级目录

    • JavaScript

      • JavaScript之函数尾调用与函数尾递归
      • 一种实现call、apply、bind的方法
      • 实现call、apply、bind
      • JavaScript闭包详解
      • 窗口间的通信与iframe跨域
      • JavaScript逻辑运算符“&&”和“||”短路原则的应用
      • Object原型梳理
      • JavaScript设计模式之发布&订阅模式
        • 发布&订阅模式满足的条件
        • $on 事件绑定
        • $emit 事件触发
        • $off 事件解绑
        • 封装
        • 观察者模式和发布订阅模式
      • JavaScript核心:两链一包
      • JavaScript之正则
      • 字符串拼接性能优化
      • JavaScript变量转换
  • Vue

  • 混合开发

  • 学习笔记

  • 小程序

  • 前端
  • JavaScript
  • JavaScript
hn-failte
2019-04-27

JavaScript设计模式之发布&订阅模式

# 发布&订阅模式

面试官:你能说说发布&订阅模式和观察者模式有什么区别吗?懵逼了吗?来,上车~

# 发布&订阅模式满足的条件

1、存储多个事件

2、每个事件可以订阅多个函数

3、提供订阅、取消订阅、触发三种方法

# $on 事件绑定

1、语法:$on(eventName, callback)

2、分析:

  • 一个事件对应多个事件函数

  • 分析绑定的这个事件名称在事件仓库中是否存在 如果存在则直接将事件函数添加到数组中去

  • 如果不存在则创建一个数组然后将事件函数添加到数组中去

# $emit 事件触发

1、语法:$emit(eventName, params)

2、分析:

  • 判断当前事件名称是否存在

  • 如果存在,则遍历数组中所有的函数,将参数传递到数组的函数中,并执行这些函数

# $off 事件解绑

1、语法:$off(eventName, callback)

2、分析:

  • 判断当前事件名称是否存在

  • 如果存在,则再判断第二个参数是否存在

  • 如果第二个参数也存在,则解绑对应的函数

  • 如果第二个参数不存在则解绑全部

# 封装

subscribe.js

const eventList = {};

const $on = (eventName,callback) => {
    if(!eventList[eventName]) {
        eventList[eventName] = [];
    }
    eventList[eventName].push(callback);
}

const $emit = (eventName,params) => {
    if(eventList[eventName]) {
        eventList[eventName].forEach((cb) => {
            cb(params);
        })
    }
}

const $off = (eventName,callback) => {
    if(eventList[eventName]) {
        if(callback) {
            let index = eventList[eventName].indexOf(callback);
            eventList[eventName].splice(index,1);
        } else {
            eventList[eventName].length = 0;
        }
    }
}

export default {
    $on,
    $emit,
    $off
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 观察者模式和发布订阅模式

1、观察者模式

观察者模式主要参与者为主题Subject,观察者Observer。

Subject和Observer具有松耦合的关系。

在Subject发生变化时,通知Observer。

2、订阅模式

订阅模式的主要参与者为发布者Publisher、订阅者Subscriber、调度中心Broker。

Publisher和Subscriber没有直接关系。两者间需要通过Broker进行沟通。

Publisher发布时,会推送到Broker,调度中心负责管理订阅,会将Publisher发布的消息通知给Subscriber。

编辑 (opens new window)
#Patterns
上次更新: 2021/07/19, 02:17:53
Object原型梳理
JavaScript核心:两链一包

← Object原型梳理 JavaScript核心:两链一包→

最近更新
01
safari 兼容问题笔记
01-26
02
electron 日志接入
12-26
03
vue3-template-compile
11-24
更多文章>
Theme by Vdoing | Copyright © 2017-2024 hn-failte | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式