-
-
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!