tetris/js/eventBus.js

37 lines
1.1 KiB
JavaScript

class EventBus{
constructor(){
this.listeners = {}
}
on(eventName, callback){
if(!this.listeners[eventName]){
this.listeners[eventName] = [];
}
this.listeners[eventName].push(callback);
return ()=>{
this.off(eventName, callback);
}
}
emit(eventName, data){
if(!this.listeners[eventName]){
return;
}
this.listeners[eventName].forEach((callback)=>{
callback(data);
})
}
async emitAsync(eventName, data){
if(!this.listeners[eventName]){
return Promise.resolve();
}
const callBackPromises = this.listeners[eventName].map((callback)=>{
return Promise.resolve(callback(data));
})
await Promise.all(callBackPromises);
}
off(eventName, callback){
if(!this.listeners[eventName]){
return;
}
this.listeners[eventName] = this.listeners[eventName].filter(listener => listener !== callback);
}
}