template-project/jsFile/tools/observer.js

68 lines
1.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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