Skip to content

Instantly share code, notes, and snippets.

@wildlyinaccurate
Last active February 12, 2021 01:05
Show Gist options
  • Save wildlyinaccurate/3209556 to your computer and use it in GitHub Desktop.
Save wildlyinaccurate/3209556 to your computer and use it in GitHub Desktop.
Really simple Javascript custom event system
var Event = function() {
var self = this;
self.queue = {};
self.fired = [];
return {
fire: function(event) {
var queue = self.queue[event];
if (typeof queue === 'undefined') {
return;
}
while (queue.length) {
(queue.shift())();
}
self.fired[event] = true;
},
on: function(event, callback) {
if (self.fired[event] === true) {
return callback();
}
if (typeof self.queue[event] === 'undefined') {
self.queue[event] = [];
}
self.queue[event].push(callback);
}
};
}();
// Basic usage
Event.on('counted.to::1000', function() {
doSomething();
});
for (i = 0; i <= 1000; i++) {
// Count to 1000...
}
Event.fire('counted.to::1000'); // doSomething() is called
@nicothed
Copy link

nicothed commented Aug 20, 2019

Very nice piece of code, thanks!

I've moved the
self.fired[event] = true;
line in "fire" to the top of the function. Otherwise, it's not called if fire is called before on (IMHO).

I've also added:
await: async function (event) { // usage (in an async function): await Event.await("counted.to::1000") return new Promise(async function (resolve, rejectUNUSED) { du.eventsQueue.on(event, resolve) }) },

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment