-
-
Save wildlyinaccurate/3209556 to your computer and use it in GitHub Desktop.
| 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 |
Thank you, both @chris-pauley and @wildlyinaccurate. I needed the forEach method Chris shared, but not in es6 mode:
queue.forEach(function (callback) {
callback();
});@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) }) },
This is really nice, thanks for sharing! Personally I need to setup a system where an callback is called every time an event is fired, so I've modified lines 17-19 to be
queue.forEach((callback) => callback());which works nicely. Thanks for sharing!