class PubSub {
constructor() {
this.handles = {}
}
// 发布事件
on(eventType, handle) {
if(!this.handles.hasOwnProperty(eventType)) {
this.handles[eventType] = []
}
if(typeof handle === 'function') {
this.handles[eventType].push(handle)
} else {
throw new Error('缺少回调函数')
}
return this
}
// 订阅事件
emit(eventType, ...args) {
if(this.handles.hasOwnProperty(eventType)) {
this.handles[eventType].forEach((item, key, arr) => {
item.apply(null, args)
})
} else {
throw new Error(`${eventType}`)
}
return this
}
// 删除事件
off(eventType, handle) {
if(!this.handles.hasOwnProperty(eventType)) {
throw new Error(`${eventType}事件未注册`)
} else if(typeof handle != 'function') {
throw new Error('缺少回调函数')
} else {
this.handles[eventType].forEach((item, key, arr) => {
if(item == handle) {
arr.splice(key, 1)
}
})
}
return this
}
}
let callback = function () {
console.log('you are so nice');
}
let pubsub = new PubSub();
pubsub.on('completed', (...args) => {
console.log(args.join(' '));
}).on('completed', callback);
pubsub.emit('completed', 'what', 'a', 'fucking day');