Skip to content

Commit f1db8b7

Browse files
committed
Implement event dispatcher
1 parent 4ca8e95 commit f1db8b7

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

data/dispatcher.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/* See license.txt for terms of usage */
2+
3+
define(function(require, exports, module) {
4+
5+
var listeners = {};
6+
7+
/**
8+
* The application event emitter.
9+
*/
10+
var Dispatcher =
11+
/** @lends Dispatcher */
12+
{
13+
on: function(type, listener) {
14+
var listeners = observers(type);
15+
listeners.push(listener);
16+
},
17+
18+
off: function(type, listener) {
19+
var listeners = observers(type);
20+
var index = listeners.indexOf(listener);
21+
if (index >= 0) {
22+
listeners.splice(index, 1);
23+
}
24+
},
25+
26+
once: function(type, listener) {
27+
var self = this;
28+
this.on(type, function observer(args) {
29+
self.off(type, observer);
30+
try {
31+
listener.apply(self, args);
32+
} catch (err) {
33+
Trace.sysout("Dispatcher.once; EXCEPTION " + err, err);
34+
}
35+
});
36+
},
37+
38+
dispatch: function(type, args) {
39+
var results = [];
40+
41+
var listeners = observers(type);
42+
for (var i=0; i<listeners.length; i++) {
43+
try {
44+
var listener = listeners[i];
45+
var result = listener(args);
46+
47+
// Store all valid results into the result array. The only invalid
48+
// type is undefined (null, 0 can be treated as valid results in some
49+
// cases).
50+
if (typeof result != "undefined") {
51+
results.push(result);
52+
}
53+
} catch (err) {
54+
Trace.sysout("Dispatcher.emit; EXCEPTION " + err, err);
55+
}
56+
}
57+
58+
return results;
59+
},
60+
};
61+
62+
// Helpers
63+
64+
function observers(type) {
65+
return type in listeners ? listeners[type] : listeners[type] = [];
66+
}
67+
68+
// Exports from this module
69+
exports.Dispatcher = Dispatcher;
70+
});

0 commit comments

Comments
 (0)