js 发布订阅模式应用场景 自己手写一个简易的发布订阅模块

本文通过示例介绍了发布订阅模式的基本实现,包括添加订阅、发布消息和取消订阅的功能。通过优化,解决了消息发送给所有订阅者的问题,实现了按标识符定向发送。此外,还展示了发布订阅模式在解决异步调用中强耦合问题的应用,以及在Vue组件间通信的实例。

在这里插入图片描述

我们先写一个简单的发布订阅:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>发布订阅模式</title>
</head>
<body>
	<script type="text/javascript">
		var shopObj = {
     
     } // 定义发布者 卖家对象
		shopObj.list = [] // 缓存列表 存放订阅函数

		// 添加订阅者
		shopObj.listen = function (fn) {
     
     
			shopObj.list.push(fn)
		}

		// 发布消息
		shopObj.trigger = function () {
     
     
			for (var i=0, fn; fn = this.list[i++];) {
     
     
				fn.apply(this, arguments)
			}
		}

		// 添加第一个订阅者
		shopObj.listen(function(color, size) {
     
     
			console.log(`订阅者1:颜色是${ 
       color}, 尺码是${ 
       size}`)
		})

		// 添加第二个订阅者
		shopObj.listen(function(color, size) {
     
     
			console.log(`订阅者2:颜色是${ 
       color}, again尺码是${ 
       size}`)
		})

		// 发布第一个消息 本意是要通知第1个订阅者 橘黄色 42尺码的货到了
		shopObj.trigger('orange', 42)
		// 发布第二个消息 本意是要通知第2个订阅者 黑色 39尺码的货到了
		shopObj.trigger('black', 39)

	</script>
</body>
</html>

在这里插入图片描述

可以看到,已经可以订阅消息,并且发布消息,但是有个问题,就是发布消息的时候,把消息发送给所有订阅者了,怎么才能解决这个问题呢?

我们回忆一下,我们在使用发布订阅的时候,是不是这样使用的,要传入一个标识:
在这里插入图片描述
然后在触发时候,和订阅时候传入的标识对应上,是不是就能解决这个问题了

我们这样改造: 添加订阅时候,传入一个标识符key, 如果缓存列表里不存在对应的list[key],那么就创建一个对应的list[key]初始值是一个空数组[]

如果有的话,直接把回调函数push进入对应的list[key]
在这里插入图片描述
完整代码:

<!DOCTYPE html>
<html lang=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值