这是一个基于发布订阅模式的消息队列框架,可用于
react
做组件间的事件通知.最好是没有任何关系并且不存在数据交互的事件通知,因为有数据的事件通知将会导致数据流的混乱.当然用于有数据传输的事件通知也没有什么不可,这个小框架也是具备这个功能的,哈哈!!
-
API列表
subscribe(eventName, eventFunc)
:订阅一个事件,同时返回一个eventHandle
用来订阅一个事件,不可重复调用,会导致绑定多个事件
eventName
:订阅的事件名称,eventFunc
:接收到订阅事件时的操作,事件携带的data
将会以第一个参数传递给该函数参数
run(eventName, data)
:触发一个事件到所有的订阅者事件发生时用来通知订阅者,会执行订阅时传入的回调函数
eventName
:发布的事件名称data
:发布事件的时候携带的数据,推荐用{key:value}形式
cancel(eventName, eventHandle)
:取消一个事件(取消订阅)用来取消订阅的事件,如果eventHandle不传,将会把整个事件删除
-
框架说明
-
EventQueue
:事件队列管理类EventHandleManager
:事件句柄管理类EventManager
: 事件回调管理类
-
该框架在运行时一直维护着两个队列,说是队列,其实是两个
Map
,一个是eventMap
,称之为事件回调队列,一个是eventHandleMap
,称之为事件句柄队列.eventMap
: 由EventManager
管理. 该map
中每一项都是key=>value
格式. 其中key
为自动生成的不重复的uuid
,用来做该回调时间的唯一key
值,可以通过该key
直接找到该回调事件.value
为函数,回调函数,订阅者订阅事件的时候传入eventHandleMap
: 由EventHandleManager
管理. 该map
中每一项都是key=>value
格式. 其中key
值为用户自定义的函数名称,可用于订阅者订阅该事件.value
为一个数组,包含多个在eventMap中的key
,可以通过value
在eventMap
中找到事件回调函数
-
流程说明:
-
订阅流程:
- 组件1调用
EventQueue.publish('EVENT1')
,发布一个事件,此时EventHandleManage
将会在eventHandleMap
中添加一个事件句柄,此时该队列中的数据为{'EVENT1'=>[]} - 组件2调用
EventQueue.subscribe('EVENT1',function(){})
订阅EVENT1
,此时EventManager
将会在eventMap
中添加一个事件回调函数,此时该队列中的数据为
{'02469657-1765-4282-8288-9aac44edfb83'=>function(){}}
接着
EventHandleMap
将会将该事件回调函数的key
,也就是句柄加入到EVENT1
的事件句柄队列中,此时该队列的数据为{'EVENT1'=>['02469657-1765-4282-8288-9aac44edfb83']}
- 组件3调用
EventQueue.subscribe('EVENT1',function(){})
订阅EVENT1
则eventMap
中的数据为
{'02469657-1765-4282-8288-9aac44edfb83'=>function(){}, 'f85bb99b-5717-4a48-9764-5879c72e5fac'=>function(){}}
eventHandleMap
中的数据为{'EVENT1'=>['02469657-1765-4282-8288-9aac44edfb83', 'f85bb99b-5717-4a48-9764-5879c72e5fac']}
- 如果这时候3中的组件调用的是
EventQueue.subscribe('EVENT2',function(){})
,注意此时EVENT2
并未发布,但是并不会影响该程序运行,它将会自动发布该事件,此时eventMap
中的数据为
{'02469657-1765-4282-8288-9aac44edfb83'=>function(){}, 'f85bb99b-5717-4a48-9764-5879c72e5fac'=>function(){}, '90543d90-759e-4c2d-8389-a4d6b49531d0'=>function(){}}
,
eventHandleMap
中的数据为{'EVENT1'=>['02469657-1765-4282-8288-9aac44edfb83', 'f85bb99b-5717-4a48-9764-5879c72e5fac'], 'EVENT2'=>['90543d90-759e-4c2d-8389-a4d6b49531d0']}
- 当组件1调用
EventQueue.run('EVENT1')
,则EventHandleManager
将会找出key
为EVENT1
中的句柄,同时根据句柄去eventMap
中找到所有的事件毁掉函数并执行,这时候,所有订阅了该事件的订阅的将会执行他们订阅该事件时绑定的额回调函数. - 当组件2或者3调用
EventQueue.cancle('Event1','02469657-1765-4282-8288-9aac44edfb83')
时,将会从eventHandleMap
中删除掉EVENT1
中key=02469657-1765-4282-8288-9aac44edfb83
的记录,并从eventMap
中将key=02469657-1765-4282-8288-9aac44edfb83
的记录删除,以保持队列整洁. - 当组件1调用
EventQueue.cancel('EVENT1)
时,将会从eventHandleMap
将key=EVENT1
的记录直接删除,从而所有的订阅者将无法订阅该事件,并且所有的事件回调函数将从eventMap
中移除
- 组件1调用
-
-
-
项目运行方式
npm install
: 安装依赖包npm start
: 运行项目npm run test
: 运行单元测试npm run build
:打包项目