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 |
@ttomdewet forEach
method is actually supported by IE9+ already. You can use it safely. MDN - forEach
@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
Thank you, both @chris-pauley and @wildlyinaccurate. I needed the
forEach
method Chris shared, but not ines6
mode: