
我们先写一个简单的发布订阅:
<!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=

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

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



