You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.2 KiB
JavaScript
83 lines
2.2 KiB
JavaScript
![]()
10 years ago
|
export default (function() {
|
||
![]()
10 years ago
|
var events = {};
|
||
![]()
11 years ago
|
|
||
![]()
10 years ago
|
function getEvent(eventName) {
|
||
|
if (!events[eventName]) {
|
||
|
events[eventName] = {
|
||
![]()
10 years ago
|
subscribers: []
|
||
![]()
10 years ago
|
};
|
||
|
}
|
||
|
return events[eventName];
|
||
|
}
|
||
![]()
11 years ago
|
|
||
![]()
10 years ago
|
function clearEvents(){
|
||
|
events = {};
|
||
|
}
|
||
![]()
11 years ago
|
|
||
![]()
10 years ago
|
function publishSubscription(subscription, data) {
|
||
|
if (subscription.async) {
|
||
|
setTimeout(function() {
|
||
|
subscription.callback(data);
|
||
|
}, 4);
|
||
|
} else {
|
||
|
subscription.callback(data);
|
||
![]()
11 years ago
|
}
|
||
![]()
10 years ago
|
}
|
||
![]()
11 years ago
|
|
||
![]()
10 years ago
|
function subscribe(event, callback, async) {
|
||
|
var subscription;
|
||
|
|
||
|
if ( typeof callback === "function") {
|
||
|
subscription = {
|
||
![]()
10 years ago
|
callback: callback,
|
||
|
async: async
|
||
![]()
10 years ago
|
};
|
||
|
} else {
|
||
|
subscription = callback;
|
||
|
if (!subscription.callback) {
|
||
|
throw "Callback was not specified on options";
|
||
![]()
11 years ago
|
}
|
||
|
}
|
||
|
|
||
![]()
10 years ago
|
getEvent(event).subscribers.push(subscription);
|
||
|
}
|
||
![]()
11 years ago
|
|
||
![]()
10 years ago
|
return {
|
||
![]()
10 years ago
|
subscribe: function(event, callback, async) {
|
||
![]()
10 years ago
|
return subscribe(event, callback, async);
|
||
|
},
|
||
![]()
10 years ago
|
publish: function(eventName, data) {
|
||
![]()
10 years ago
|
var event = getEvent(eventName),
|
||
|
subscribers = event.subscribers;
|
||
|
|
||
|
event.subscribers = subscribers.filter(function(subscriber) {
|
||
|
publishSubscription(subscriber, data);
|
||
|
return !subscriber.once;
|
||
|
});
|
||
|
},
|
||
|
once: function(event, callback, async) {
|
||
|
subscribe(event, {
|
||
|
callback: callback,
|
||
|
async: async,
|
||
|
once: true
|
||
|
});
|
||
|
},
|
||
|
unsubscribe: function(eventName, callback) {
|
||
|
var event;
|
||
![]()
11 years ago
|
|
||
![]()
10 years ago
|
if (eventName) {
|
||
|
event = getEvent(eventName);
|
||
|
if (event && callback) {
|
||
|
event.subscribers = event.subscribers.filter(function(subscriber){
|
||
|
return subscriber.callback !== callback;
|
||
|
});
|
||
![]()
11 years ago
|
} else {
|
||
![]()
10 years ago
|
event.subscribers = [];
|
||
![]()
11 years ago
|
}
|
||
![]()
10 years ago
|
} else {
|
||
|
clearEvents();
|
||
![]()
11 years ago
|
}
|
||
![]()
10 years ago
|
}
|
||
|
};
|
||
![]()
10 years ago
|
})();
|