68 lines
1.4 KiB
JavaScript
68 lines
1.4 KiB
JavaScript
/** 使用方法
|
||
* 页面引入
|
||
* import Utils from '@/jsFile/tools/observer.js';
|
||
*
|
||
* 使用
|
||
* // 订阅消息
|
||
* Utils.subscribe('test', function (e) {
|
||
* console.log(e);
|
||
* });
|
||
* setTimeout(()=>{
|
||
* // 发布消息
|
||
* Utils.publish('test', {
|
||
* msg: '参数'
|
||
* });
|
||
* },3000)
|
||
*/
|
||
|
||
|
||
/*
|
||
* 发布-订阅模式(观察者模式)
|
||
* */
|
||
|
||
export const Observer = (function() {
|
||
let messages = {}; // 消息队列
|
||
|
||
return {
|
||
// 订阅消息
|
||
subscribe(type, fn) {
|
||
// 消息不存在,创建消息执行队列
|
||
if (typeof messages[type] === 'undefined') {
|
||
messages[type] = [fn];
|
||
}
|
||
// 消息存在,将执行动作推进消息执行队列
|
||
else {
|
||
messages[type].push(fn);
|
||
}
|
||
},
|
||
// 发布消息
|
||
publish(type, args) {
|
||
// 如果消息未被注册,返回false
|
||
if (!messages[type]) return false;
|
||
// 定义消息信息
|
||
let events = {
|
||
type: type, // 消息类型
|
||
args: args || {} // 消息携带数据
|
||
};
|
||
for (let i = 0; i < messages[type].length; i++) {
|
||
// 执行动作
|
||
messages[type][i].call(this, events)
|
||
}
|
||
},
|
||
// 删除消息
|
||
remove(type, fn) {
|
||
// 消息队列存在
|
||
if (messages[type] instanceof Array) {
|
||
// 从最后一个消息动作遍历
|
||
let i = messages[type].length - 1;
|
||
for (; i >= 0; i++) {
|
||
// 存在该消息动作,则移除
|
||
messages[type][i] === fn && messages[type].splice(i, 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
})();
|
||
|
||
export default Observer;
|