首页 > 其他分享 >js-设计模式之订阅发布模式简单理解和实践

js-设计模式之订阅发布模式简单理解和实践

时间:2023-08-09 17:24:12浏览次数:31  
标签:function 订阅 js eventName 充值 topic 设计模式 页面

/**
 * 啥是发布订阅模式
 * 举个栗子--场景: 充值成功 切换到个人中心页面刷新余额 切换到会员中心页面刷新会员状态等
*/

// 定义一个对象 作为接收事件的载体
const eventBus = {
  topic: {}, // 这里为啥是个对象呢 首先肯定不止是一个事件,所以得是数组或者对象,那为什么不是数组呢,因为相同的事件会在好多页面使用,若是使用数组,同一个事件会在同一个页面上触发多次
  on: function (eventName, cb) { // 事件订阅函数: 接收参数肯定有事件名和一个订阅回调函数
    if (!this.topic[eventName]) {
      this.topic[eventName] = [] // 这里为什么要用数组呢 因为若是多个页面都订阅了同一个事件,不用数组保存回调的话肯定会被覆盖的,导致最后只会有一个页面的订阅生效
    }
    this.topic[eventName].push(cb)
  },
  emit: function (eventName) { // 事件发布函数: 接收一个函数名
    this.topic[eventName] && this.topic[eventName].forEach(item => { item() }) // 触发事件的cb
  }
}

// 这是个人中心页
function personCenterPageOnLoad() {
  eventBus.on('paySuccess', function () {
    console.log('个人中心-收到充值成功的通知');
  })
}

// 这是会员中心页
function vipCenterPageOnLoad() {
  eventBus.on('paySuccess', function () {
    console.log('会员中心-收到充值成功的通知');
  })
}


// 这是支付成功回调
function paySuccessHandle() {
  console.log('充值成功');
  eventBus.emit('paySuccess')
}

// 要在页面onLoad的时候就订阅充值的事件
personCenterPageOnLoad()
vipCenterPageOnLoad()

// 用定时器假装触发充值
setTimeout(() => {
  paySuccessHandle()
}, 2000);

标签:function,订阅,js,eventName,充值,topic,设计模式,页面
From: https://www.cnblogs.com/zoo-x/p/17617425.html

相关文章

  • delphi 自带的JSON序列化类
    unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,System.JSON.Serializers,Vcl.StdCtrls;typeTForm1=class(TForm)Memo1:TMemo......
  • 23种设计模式及其应用场景
    23种设计模式及其应用场景设计模式主要分三个类型:创建型、结构型和行为型。创建型有:一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点;应用场景:一个无状态的类使用单例模式节省内存资源。二、AbstractFactory,抽象工厂:提供一个创建一系列相关或相......
  • 快速了解JavaScript的JSON
    JSON是用于存储和传输数据的格式。JSON通常用于服务端向网页传递数据。1什么是JSON?JSON英文全称 JavaScript Object NotationJSON是一种轻量级的数据交换格式。JSON是独立的语言 *JSON易于理解。2JSON语法基本上JSON对象就是基于JavaScript对象,因......
  • 200多个js技巧代码
    1.文本框焦点问题onBlur:当失去输入焦点后产生该事件onFocus:当输入获得焦点后,产生该文件Onchange:当文字值改变时,产生该事件Onselect:当文字加亮后,产生该文件<inputtype="text"value="mm"οnfοcus="if(value=='mm){value=''}"οnblur="if(value==''){va......
  • NETCORE - 读取 appsettings.json 配置数据
    NETCORE-读取appsettings.json配置数据 环境:net6 webapi 1. 配置appsettings.json数据{"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warn......
  • js之实现for-in/of循环对象
    1.in/of对比for...in...是es5出的循环方法,for...of...是es6推出的。两个都是迭代数据的。for...in:以任意顺序迭代对象的可枚举属性。=>根据key值来遍历for...of...:遍历可迭代对象,定义要迭代的数据。2.for...in...//表现letobj={a:1,b:'2',c:false,d:undefi......
  • 给首布局选择项目带出明细内容js控制
    1.通过一个中间的jsp进行json查询传递<%@pageimport="java.util.Map"%><%@pageimport="java.util.ArrayList"%><%@pageimport="java.util.List"%><%@pageimport="com.velcro.workflow.pipe.service.ExtendJspServ......
  • nodejs preset 是什么
    preset-built-in是指预设的内置功能或选项。这意味着在软件或设备中已经提前设置好了一些功能或选项,用户可以直接使用,而无需自己进行设置或配置。这些预设的内置功能或选项通常是为了方便用户操作或提供一些常用的设置。预设(Presets)Babel的预设(preset)可以被看作是一组Babel......
  • nodejs 函数以_ 下划线开头是什么意思
    在JavaScript中,函数名称以下划线_开头通常表示该函数是私有的,意味着它只能在当前函数或对象的内部使用,而不能在外部访问或调用。这是一种命名约定,用于表示函数的可见性和访问权限。在许多JavaScript库和框架中,开发者经常使用下划线开头的函数名称来指示这些函数是供内部使用的,以......
  • nodejs 的@符号作用
    在Node.js中,@符号通常用于引用模块的路径。当使用@符号时,它会被解释为指向当前模块的根路径。这样可以使得模块引入更加简洁和可读,同时也有助于避免引入模块时出现相对路径的问题。例如,假设我们有一个名为"utils"的模块,在使用相对路径时,我们可能需要这样引入它:constutils=req......