Last active
February 12, 2021 01:05
-
-
Save wildlyinaccurate/3209556 to your computer and use it in GitHub Desktop.
Really simple Javascript custom event system
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
@screets it think he meant the es6 arrow callback...
@wildlyinaccurate thanks a bunch. I think self.fired
should be an object self.fired = {}
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
@ttomdewet
forEach
method is actually supported by IE9+ already. You can use it safely. MDN - forEach