订阅

作者: anddju | 来源:发表于2019-07-02 13:45 被阅读0次

订阅,又名观察者(你说观察者,我还真就知道了) 。 名义上是一种模式。

前言

今儿面试。。。面试体验很差。。。不过提到了一个概念“订阅”。
原话:
面试官:你知道订阅么?
我:订阅?
面试官:你干了两年,订阅你都不知道?
我:???? 我说说事件侦听吧?
面试官:那行,你说说吧。
我:....

为期两年的开发中。。真的没有遇到过订阅,从字面理解,就是说:一个东西改变后,要告诉别人我改变了。从这个理解出发,我想到的就是事件侦听,准确的说,是自定义事件的事件侦听。

下面以侦听localStorage改变为例,写一下自定义事件侦听

js 创建侦听函数
const listenStorageKeys= ["shop_id"];  // 需要侦听的localstorage
// 添加js 侦听localstorage
var orignalSetItem = localStorage.setItem;
localStorage.setItem = function(key,newValue){
  if(listenStorageKeys.includes(key)){
    var setItemEvent = new Event("setItemEvent."+key);
    // 自定义字段
    setItemEvent.set_key = key;  
    setItemEvent.set_value = newValue;
    window.dispatchEvent(setItemEvent);
  }
  orignalSetItem.apply(this,arguments);
};

// 使用
window.addEventListener("setItemEvent.shop_id", function (e) {
 console.log(e.set_key ,e.set_value,"cccccccccccc")
});

然而在回来的过程中。我记住了这个名词:“订阅”,所以现在搜一下,看看订阅是什么

参考文章:

  1. Javascript设计模式之发布-订阅模式
  2. js中的一对多 - 订阅发布模式
  3. 深入理解JavaScript系列(32):设计模式之观察者模式

第二篇,更倾向于Event.listen的使用 ,但也进一步说明,订阅实际上就是总结的这几点

从第一篇文章中,我总结了以下几点:

  • 订阅实际上是一个。。。类
  • 这个类,包含以下属性
    1. peopleList : 订阅内容 ,包含着订阅后需要执行的操作和订阅内容
    2. listen : 增加订阅后需要执行的操作
    3. trigger:执行订阅操作
var event = {
    peopleList:[], // 这里应该用对象比较好
    listen:function (key,fn) {
        if (!this.peopleList[key]) { //如果没有订阅过此类消息,创建一个缓存列表
        this.peopleList[key] = [];
        }
        this.peopleList[key].push(fn)
    },
    trigger:function () {
         let key = Array.prototype.shift.call(arguments);
        let fns = this.peopleList[key];
        if (!fns || fns.length == 0) {//没有订阅 则返回
            return false;
        }
        for(var i=0,fn;fn=fns[i++];){
            fn.apply(this,arguments);
        }
    }
}

var installEvent  = function (obj) {
    for(var i in event){
        obj[i] = event[i];
    }
}

let yourMsg = {};
installEvent(yourMsg);
yourMsg.listen('marrgie',function (name) {
    console.log(`${name}想知道你结婚`);
})
yourMsg.listen('unemployment',function (name) {
    console.log(`${name}想知道你失业`);
})

yourMsg.trigger('marrgie','张三');
yourMsg.trigger('unemployment','李四');
/*
张三想知道你结婚
李四想知道你失业
*/

相关文章

  • 订阅

    什么是订阅功能? 订阅功能是小宝机器人推出的,旨在为东大学子提供个性化定制信息获取服务的功能。 为什么要推出订阅功...

  • 订阅

    订阅,又名观察者(你说观察者,我还真就知道了) 。 名义上是一种模式。 前言 今儿面试。。。面试体验很差。。。不过...

  • 动手实现EventBus v1.2

    EventBus原理 订阅逻辑register注册订阅者反射遍历订阅者的方法通过订阅注解从订阅者中获取订阅事件响应...

  • 哔哩哔哩推送

    订阅列表 - 查看你订阅的up 订阅+UID/名称 - UP新视频与直播推送 取消订阅+UID/名称 - 取消订阅...

  • RxSwift 数据绑定与解绑

    订阅 取消订阅

  • redis原理

    发布订阅模式 订阅者订阅频道:可以一次订阅多个,比如这个客户端订阅了 3 个频道。subscribe channe...

  • 虎牙如何买订阅,虎牙直播怎么刷订阅

    虎牙怎么买订阅粉丝 虎牙直播订阅怎么买 虎牙直播刷订阅 找微信youtui2 虎牙如何买订阅 虎牙买订阅 虎牙...

  • RxJava背压

    订阅分为:同步订阅 异步订阅 同步订阅Rxjava1与Rxjava2中 同步订阅没有用到缓冲区,只要上游事件数量不...

  • RabbitMQ

    1.订阅消息:basic.consum持续的订阅消息;basic.get订阅消息->获得单条消息->取消订阅消息。...

  • redis——day2

    一,订阅发布 命令:订阅 subscribe 频道发布 publish 频道 "value"1,2,订阅...

网友评论

    本文标题:订阅

    本文链接:https://www.haomeiwen.com/subject/gmszcctx.html