template-project/jsFile/tools/observer.js

68 lines
1.4 KiB
JavaScript
Raw Normal View History

/** 使
* 页面引入
* 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;