这篇博客,我们来说下事件队列。
首先,事件队列你别把它想的多复杂,其实就是数组、json 那些玩意,因为我们 js 整个就是这些东西组成的,你想多复杂也没有,就这些东西。
然后事件队列的目的是什么?很简单,小程序无所谓,你怎么写都能出来。
但是对于一个大型的程序来说,我们往往这个程序是分成很多很多的模块,甚至根本就不是同一个人在写,可能是一个团队,甚至于很多团队,很多公司。
所以我们在这个过程当中,你很多的东西是要考虑的,不是说我怎么能把这事办出来,办出来你怎么都能办出来,但是你要考虑的是怎么把它办的好。
其中一个最大的问题就是说,模块之间,程序之间,它会存在一个所谓的耦合。
说白了就是,比方说,我在我这边去调用一个别人的方法叫做 a.show,这就叫耦合,什么意思呢?
万一哪天人家 show 没了呢?或者哪天整个对象都消失了呢?有没有可能?是有的。
所以耦合说白了,就是别的程序随便一改,你这边也得跟着改,而你的程序变了,有可能又导致另外一个 c 又变了,c 变了又把 d 变了,这样的一个项目就没法往下做,随便改一行代码,得一堆人跟着我一块改,那就废了。
所以说,像这个事件队列它就有一个最大的好处。
就是说,我可以借助它,来让所有的这些模块之间,不要那么严丝合缝的耦合在一块,功能还是能实现的,比方说我这点了一下,那边有产生变化,这事还能做,但是我就不用去关心,那边有没有 show 啊,那个对象到底叫什么,这事你不用管,不关你的事,反正那边总有人接收这个事件,你就负责把这事件发出去就行,至于谁接收,几个人接收,谁处理,谁先谁后,这个跟你一毛钱关系都没有,你也不用管。
这样的话,我们最大的一个好处就出来了,就是说,这个程序本身,你可以比较随意的去修改。
然后意思就是说,你这边大量的修改完之后,别人那边需要做的调整会少很多,这是它最大的一个作用。
那么我们先稍微的来解释下这个词,为什么叫队列?
其实我们可以用一张图来表述下这个事。
首先,我们在接触 js 的时候,周围的人就一直在说事件队列好,它能帮我们解决问题,那么好在哪?为什么能帮我们解决问题?
我们典型的一个功能是这样的,这个功能肯定有一个触发的人,是谁不一定,比如我们叫它触发者:
这个触发者其实可以是任何人,比如说可以是个按钮,用户点一下按钮,是可以的。
也可以是一个 ajax,比如我这边一直在等着数据来,什么时候来我不知道,但反正来了,它就可以触发一个事件,然后给到这些需要数据的人:
然后一个典型的情况下,可能是这样的。
比如我这边还有一个使用者,叫做 obj:
使用者指的是,它需要用到上面的某种东西,比如它需要得到通知,或者怎么样。
那么一个比较典型的情况就是,我直接去调用它,比如 obj.show():
注意,这个情况下,有很多的问题。
第一,使用者有没有可能不只是一个,而是一堆?是有可能的。
比如说,数据没过来之前,可能列表显示不出来,然后页码也显示不了,那么这就是 2 个使用者了。
第二,有没有可能要变的?太有可能了,都不是一个,变的可能性就很大了,一会这个,一会那个。
所以在这个时候,如果我直接 obj.show() 这么写的话,那就有很大的问题。
比方说,那边又突然多了个 obj2,它也是要用我这数据的人。
那我们就需要在来个 obj2.show():
然后如果 obj 这边觉得 show 不好听,突然改名了,改成 setData 了。
这个有可能吗?是有可能的。
那么我们上面也是要跟着改的:
所以就有很多的问题。
说白了就是,如果你采用过去这种直接去调用的方式,问题就特别多,我们在上面是需要非常频繁的去修改,这就乱套了。
我们知道,对于稍微有点规模的程序来说,最好的情况下,是你改你的,我改我的,我们俩谁也不管谁。
那么这个事件队列,它是怎么做到能够去解决这个问题呢?
其实特别简单,相当于有一个中间商,什么意思呢?
说白了,就是我中间有一个事件队列这样的东西存在。
这个东西命名很不统一,有的人叫它 Queue,也有人叫它 Pipe:
像我个人更喜欢叫它 Pipe。
因为其实说白了,它就是起一个管道的作用,从左边给右边,从右边给左边。
简单来说,在这个事上是这样的。
就是右边的使用者,它会跟这个 Pipe 去注册一下,它说:哥们,我需要一个事件。(你也可以叫消息或者什么,很多叫法)
比如我这个事件叫 aaa:
可能我跟它说了,然后这时候,也有很多别的使用者,我们之间都不需要相互认识对方,反正都同时跟它说了,我要 aaa,其他人说我也要我也要,就这样一个感觉:
那这时候,Pipe 它就偷偷的拿个小本记上了,这个哥们要这个,那个哥们也要这个。
这个小本其实就是 json。
然后接下来,这个触发者它需要知道这个事件有多少人在监听吗?它根本就不需要知道。
它只需要告诉这个中间商,我这东西来了, 比如一个数据 data,你看看谁要,赶紧给它们:
然后这个中间商 Pipe 再掏出自己的小本,去找这个 data 都有谁要:噢,有三份,然后在给到对应的人。
其实就这么简单,这就是所谓事件队列的本质。
说句特别实在的话,这个东西它写起来很简单,但是你真的想把它用的很灵活,还是一个有点难度的事。
所以这个事件队列,其实它也可以叫事件管道,它本质上其实就是一个注册的机制:
你需要某种东西,好,你告诉我,你说我需要这东西,当然我本身不提供数据,但是接下来等到这东西哪天我有了,我可以告诉你,可以给你。