00:00
Hello,大家好,这个小节呢,我们来实现一下消息订阅与发布这个功能,也就是我们平常所说的订阅者模式。使用这个模式呢,它可以对代码进行分离,然后呢实现代码解耦,其实呢,呃,这个效果呢,与我们上一个小节所做的事件总线呢,效果差不多,不过呢,跟那个也略微有点不太一样啊。不过最终效果就是为了啊实现代码的一个灵活性。好了,那么下边的话,我们首先先对最终的结果做一个演示,看完结果之后咱们再实现代码。好,那么首先的话,我们打开编辑器。然后我们要定先去订阅,订阅一个频道。我写一下pub subb.subscribe。其实就跟我们平时订阅某一个这个博主大V啊,或者某一个这个YouTube上面的channel啊是差不多的。好了,比方说我们这儿来一个配啊购买。
01:03
然后我们这儿可以传一个参数贝塔。然后里边我们可以做一个输出啊,比方说用户下了个单,用户下单之后呢,商家要接单。接到了订单。准备开始制作。那光他订阅不行啊,还得另外一个角色也得订阅啊。谁呢?比如说骑手。骑手。接到订单,准备开始去取餐。啊,也就是说呢,一个消息。你只要呢,支付成功了啊,将会呢,有两个角色。来收到这个消息,一个呢是商家啊,另外一个呢是这个骑手,当然你后续还可以加入更多的一些角色来监听这个消息。那下边的话呢,我们监听已经完毕了啊,下边就开始呢,由他来发布消息。
02:00
我们写一个pub subb.publish单词本身就是发布的意思。啊,我们写一个配,比如说用户真的支付了,然后呢,并且下载一些商品啊,下载一些这个一个。午餐吧,举个例子哦,然后呢,里边传入一些信息,比如说title有这个鱼香肉丝,肉丝盖饭。然后价格比如说20的位置呢,是在三年二班。大家举个例子啊,那么这个时候的话,因为一执行这个代码,然后我们这两个回调就都会去执行。好了,那最终的实现的最终的这个使用方式我们已经写完了,写完之后,接下来我们开始实现一下效果。呃,谁的话,我们首先要先来定义这个变量,Pub啊,Pub subb啊,等于一个对象。然后它里边呢,有两个方法。
03:01
一个呢是subscribe订阅的。他在接收两个参数,第一个参数是这个。啊,频道channel,当然你可以写任何类型的参数啊,比如是写type等等都可以,然后第二个呢,是这个回调call back。好,这是一个,然后另外一个呢,是发布消息。是订阅频道。先不写这个注释了,写这样写。订阅频道。然后还有一个。这个呢是发布消息。这是publish publish。他这块的话也是接受两个参数,第一个参数呢是啊这个频道,第二个呢是数据。那完成之后呢,我们接下来的话呢,就开始实现功能啊,这个功能的话与事件总线那块很像啊,但是又不太一样,不太一样在哪呢?就是每一个的订阅它都是可以管理的,也就是说你添加完这个订阅之后,可以单独将这个订阅呢。
04:11
取消。啊,就跟我们平时关注某一个博主是一样子的,你可以关注啊,我也可以关注啊,他也可以关注,那关注说比方说有一天我不喜欢他了,那我就可以取消关注。我的取消对于其他人人来说是没有任何影响的。而对于我们上一个小节所说的做的事件总线的话,如果说想要取消某一个绑定的话是实现不了的。而在消息发布、订阅与。这个发布的这块的话,是可以实现对单个的订阅进行取消的。所以说呃,每一次,每一个订阅都是独一无二的,在这的话,我们就要对它做一个单独的管理,为每一个订阅创建一个唯一的编号,所以说在这儿呢,我们需要一个唯一的编号。创建为一。
05:02
的这个编号,那唯一的编号的话,我们放哪比较合适呢?其实我们可以放到这个地方哎。这个ID。订阅的唯一ID。默认值给他来一个一,然后下边的话,我们写一下这个。个编号等于一个token下划线,然后加上一个z.ID加加。呃,这样一来的话呢,这个token也就是唯一的编号,我们就造出来了啊,第一次呢它是一,第二次呢它是二,第三次呢它是三啊,以此类推。编号有了之后呢,下一步我们就要去保存了啊,跟上一次的事件绑定是一样的啊,它呢是一个一一对应的关系,所以说我们可以选择使用对象进行一个保存。于是呢,我们还需要定义一个属性。就是call back。啊,这个就是。频道。与回调啊,它的一个容器。
06:02
最后呢,形式是这样子的,大家可以看一下,我们这是一个频道配,我们把配放进来。然后里边呢是回调,但是回调的话,我们不能直接这么去保存。因为如果这样去保存的话呢,我们不好去对它做一个移除,所以说我们怎么办呢,我们这样来做。Token_一是一个回调,Token_二这是另外一个回调,这样一来,如果说你想想想要删除某一个。回某一个订阅的话,你就可以直接通过这个编号来找到它,找它之后就可以把它删掉了。啊,所以说这个保存的结构呢,与上一次那个事件总线还是不太一样的,好了,那下边我们就开始呢,往里边要添加了。啊,怎么来添加呢?以当前来为例,那假如说它默认情况下,此时呢,就是应该ton下划线为一,并且channel的值应该是配。
07:01
我们就要往里边去存。好,存的话还要判断一下,到底有没有判断。这个calls属性中是否存在这个配。如果。this.call backs,然后下标channel,这里我们不能直接使用pay啊,因为如果直接写pay的话就写死了,我们要使用channel这个变量。啊好,那如果说存在,我们就应该往里边直接去加入了啊,就直接往里边再添加,那如果说没有的话,我们就应该去初始化这个结构。好,假如说有。有的话是这么一个情况,需要往里面加一个新的属性,那就应该是this.call。然后channel。啊,他已经是个对象了,然后直接下标。将哦,Sorry啊,我们这需要把那个类型要拿一下。
08:00
直接把这个谁放进来,直接把这个放进来。然后等于call back就可以了。好,那如果说要是不存在呢,比如说第一次来配它没有,没有的话,我们就应该把这个结构给搭出来。所以说应该这样来做,this.calls。好,下标。写一下这个channel。它应该等于谁呢?它应该等于是个对象。并且对象里边呢,还得有这个ID。也就是有这个东西ton小换境一或者玩二。所以说的话,我们应该把它拿过来作为一个这个属性。是因为它是个变量,所以说在声明时需要用一个中括号。啊,然后去表示,然后后边的话再去设置回调来一个。这个call back。OK,搞定。啊,这是。当前的话对于订阅功能的一个实现,那么添加完成之后,我们一起来看看添加之后的一个结果怎么样吧,啊把这个呢先注掉。
09:05
上边这个位置我们打印一下结果pub保存。然后点开浏览器,一起来看看效果。刷新一面啊,他说,TALKING2 is not find pub sub not find。然后这一块的话,我们来看一看是哪出了问题。Pub subscribe。第第八行。第八行。哦。稍等一下,因为我们把这呢提前写好了,所以说我们需要把它先移除一下。再来看结果怎么样。刷新一面。好,大家看一下啊,此时的话我们的效果就已经出来了,然后点开call bags,点开这个pay。你可以看到有token_1token_二没有问题,当然我们还可以添加其他频道的一个订阅啊,比如说用户呢,取消了cancel。
10:03
这个时候的话,我们。再来写一下。比如说商家。接到了取消的请求。啊,来看看这这三个写完之后,它的一个结果是怎样的,然后刷新页面,然后点开它。点开它,你看有两个,一个是cancel。对应的一些订阅的回调,还有呢,是pay支付的这个回调123。OK,那没有问题,这是当前关于订阅的,下边呢,我们下边的话,我们来把发布消息这块实现一下。发布这个其实就比较简单了。就是调回调就完事了。好,然后接下来我们在这儿呢,需要先获取。当前频道中所有的回调。啊,然后。当然我们应该是要去判断一下它有没有啊,如果说this点。Call bags。
11:00
然后来一个channel。他得有啊,如果说没有的话,那都白扯是吧,有的话我们就把。回调都获取到。啊,怎么个获取法呢?来看一下,比如说我们这里还是以这个佩莱为例。它里边有token。下划线一还有token_二有两个,我把这个先注掉啊,因为没有它的话直接去写不是很方便。然后把这个折一下。我们要把这些回调都要拿到。啊,首先我们应该先把这个对象呢,先获取到对象是谁呢?其实对象就是this.call这个pay,也就是现在这个this.call bags channel啊,就是它。那我们要获取的是它对应的这个谁啊,后边这个回调。所以说我们可以这样来做。就是object.values。然后this.call bags。中括号,Channel。这样的话,我们就拿到了所有的这个回调了,拿到回调之后呢,咱们再开始遍历for each,然后call back。
12:04
啊,在里边我们执行回调就可以了。Call back,并且传入参数。OK,搞定,下面的话我们来看一看这个能不能正常去运行啊,点开它右键刷新。看这商家接到订单开始制作制作啊,当然我们也可以呢,把这个data也放进来,它也是可以的。因为在运行时呢,把数据传了进来,这个回答在执行时是有实参的,一起来看一看,刷新一遍,看这。是没有问题的。OK。那关于。咱们订阅发布这块的一两个功能,我们就先到这儿啊,咱们这个小节也就先到这儿保存一下,下一个小节我们来实现一下这个取消订阅。
我来说两句