listen: 订阅者订阅事项时传入唯一的key和事项
trigger: 发布者查找唯一的key并触发内部的事项
remove: 传入唯一key和事项,匹配之后移除该事项
/**
* 发布订阅模式
* listen: 订阅者
* trigger: 发布者
* remove: 移除订阅事项
* **
* time: 2021/10
* sub: private
* version: 1.0
*/
var Event = (function () {
var list = {},
listen,
trigger,
remove;
listen = function (key, fn) {
if (!list[key]) {
list[key] = []
}
list[key].push(fn)
};
trigger = function () {
var key = Array.prototype.shift.call(arguments)
var fns = list[key]
if (!fns || fns.length === 0) {
console.log(`not found key:${key}`)
return false
}
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments)
}
};
remove = function (key, fn) {
var fns = list[key]
if (!fns) {
console.log(`not found key:${key}`)
return false
}
if (!fn) {
fns && (fns.length == 0)
} else {
for (var i = fns.length - 1; i >= 0; i--) {
var _fn = fns[i]
if (_fn == fn) {
fns.splice(i, 1)
}
}
}
console.log(list)
};
return {
listen,
trigger,
remove
}
})();
Event.listen('red', function(size) {
console.log(size)
})
Event.listen('block', function(size) {
console.log(size)
})
Event.listen('green', function(size) {
console.log(size)
})
Event.trigger('red', 10)
Event.trigger('block', 20)
Event.trigger('green', 30)