前端实现订阅发布

简单总结了订阅发布模式的几个步骤:
1、声明一个数组用于缓存订阅用户

let list = []

2、实现订阅功能,参数key用于区分订阅事件,参数fn为回调函数

const listen = function(key,fn){
     if(!key || !fn) return;
     const item = {
         key,
         fn
     }
     list.push(item)
};

3、实现发布功能,通过发布指定的key值,在缓存列表中找到相同key值的订阅用户,将订阅用户的回调函数指向发布者,实现参数传递

const trigger = function(){
       const [key,...other] = arguments;
       const fns = list.filter( item => item.key === key);
       if( fns.length === 0 ) return;
       for( let { fn } of fns){
            fn.call(this,...other)
       }
   };

4、移除订阅,通过指定key值跟fn值删除缓存列表的订阅用户,如果没有fn,将删除指定key值的所有订阅用户

const remove = function(key,fn=null){
       if(!key) return;//没传key值直接返回
       for(let i = list.length - 1;i >= 0; i--){
            if(!fn){//没传fn,删除指定key的所有订阅用户
                if(key == list[i].key){
                    list.splice(i,1)
                }
            }else{//传fn,删除指定key&fn的订阅用户
                if(key == list[i].key && fn == list[i].fn){
                    list.splice(i,1)
                }
            }
        }
}

实现订阅发布的基本功能已经完成,简单封装下如下:

var Event = (function(){
   let list = [],
   listen,
   trigger,
   remove;
   //订阅
   listen = function(key,fn){
       if(!key || !fn) return;
       const item = {
           key,
           fn
       }
       list.push(item)
   };
   //发布
   trigger = function(){
       const [key,...other] = arguments;
       const fns = list.filter( item => item.key === key);
       if( fns.length === 0 ) return;
       for( let { fn } of fns){
            fn.call(this,...other)
       }
   };
   //移除订阅
   remove = function(key,fn=null){
       if(!key) return;//没传key值直接返回
       for(let i = list.length - 1;i >= 0; i--){
            if(!fn){//没传fn,删除指定key的所有订阅用户
                if(key == list[i].key){
                    list.splice(i,1)
                }
            }else{//传fn,删除指定key&fn的订阅用户
                if(key == list[i].key && fn == list[i].fn){
                    list.splice(i,1)
                }
            }
        }
   }
   return {
       listen,
       trigger,
       remove
   }
})()

基本用法,简单实例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<script src="./pubsub.js"></script>
<body>
    
</body>
<script>
    let fn = function(color){
        console.log('k1颜色是'+color)
    }
    let fn2 = function(color){
        console.log('k1-1颜色也是'+color)
    }
    let fn3 = function(color){
        console.log('k2颜色是'+color)
    }
    Event.listen('k1',fn)
    Event.listen('k1',fn2)
    Event.listen('k2',fn3)

    Event.trigger('k1','红色')
    Event.trigger('k2','黑色')

    Event.remove('k1',fn2)
    console.log('-------移除(k1,fn2)-------')

    Event.trigger('k1','紫色')
    Event.trigger('k2','蓝色')
</script>
</html>

输出结果如下:

//k1颜色是红色
//k1-1颜色也是红色
//k2颜色是黑色
//-------移除(k1,fn2)-------
//k1颜色是紫色
//k2颜色是蓝色
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,用于在低带宽和不稳定的网络环境下,实现物联网设备之间的即时通信。前端可以使用MQTT来订阅消息,以获取实时的数据更新。 首先,我们需要引入MQTT的客户端库。一般来说,我们可以使用开源的Paho MQTT客户端库来实现。可以通过直接下载js文件,或者使用npm安装。 接下来,我们需要创建一个MQTT的客户端实例。通过指定MQTT broker的地址、端口和协议,我们可以建立与broker的连接。同时,我们还需要指定一个client ID,用于标识当前的客户端。 一旦连接建立成功,我们可以通过使用subscribe()方法来订阅特定的主题(topic)。主题可以看做是一种消息的分类或者标签。当有新的消息发布到这个主题上时,前端会收到相应的消息回调。 在订阅成功后,前端就可以接收到来自broker的实时消息了。前端可以定义一个回调函数,用于处理接收到的消息。这个回调函数可以根据消息的内容,更新页面上的相关数据或者执行相应的操作。 如果前端不再需要订阅某个主题,可以使用unsubscribe()方法来取消订阅。 需要注意的是,由于前端是在浏览器中运行的,它的网络连接通常是不稳定的。因此,在实际应用中,我们一般会在连接断开时,尝试重新连接,以确保能够持续接收到实时消息。 总的来说,前端通过MQTT订阅消息,可以实现实时数据的获取和展示,在物联网应用、实时监控等场景中有着广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值