forked from phiggins42/bloody-jquery-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pubsub.js
116 lines (101 loc) · 3.49 KB
/
pubsub.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
jQuery pub/sub plugin by Peter Higgins (dante@dojotoolkit.org)
Priority added by Bob Bonifield (bobbonifield@gmail.com)
Loosely based on Dojo publish/subscribe API, limited in scope. Rewritten blindly.
Original is (c) Dojo Foundation 2004-2010. Released under either AFL or new BSD, see:
http://dojofoundation.org/license for more information.
*/
;(function(d){
// the topic/subscription hash
var cache = {};
d.publish = function(/* String */topic, /* Integer? */priority, /* Array? */args){
// summary:
// Publish some data on a named topic with the option of only pushlishing
// to callbacks with a specific priority
// topic: String
// The channel to publish on
// priority: Integer?
// The priority to publish at. If not provided, every handler for a
// given topic is executed.
// args: Array?
// The data to publish. Each array item is converted into an ordered
// arguments on the subscribed functions.
//
// example:
// Publish stuff on '/some/topic'. Anything subscribed will be called
// with a function signature like: function(a,b,c){ ... }
//
// | $.publish("/some/topic", ["a","b","c"]);
// | $.publish("/some/topic", 20, ["a","b","c"]);
if (cache[topic]){
var priority_supplied = !isNaN(priority),
callbacks = [];
if (priority_supplied){
cache[topic][priority] && d.each(cache[topic][priority], function(){
this.apply(d, args || []);
});
} else {
args = priority;
d.each(cache[topic], function(){
d.each(this, function(){
this.apply(d, args || []);
});
});
}
}
};
d.subscribe = function(/* String */topic, /* Integer? */priority, /* Function */callback){
// summary:
// Register a callback on a named topic with an optional subscription priority
// topic: String
// The channel to subscribe to
// priority: Integer?
// The priority that the callback should use. If not provided, the callback
// will use the default priority.
// callback: Function
// The handler event. Anytime something is $.publish'ed on a
// subscribed channel, the callback will be called with the
// published array as ordered arguments.
//
// returns: Array
// A handle which can be used to unsubscribe this particular subscription.
//
// example:
// | $.subscribe("/some/topic", function(a, b, c){ /* handle data */ });
// | $.subscribe("/some/topic", 20, function(a, b, c){ /* handle data */ });
var default_priority = d.subscribe.default_priority,
priority_not_provided = typeof callback === 'undefined';
if (priority_not_provided){
callback = priority;
priority = default_priority;
}
if(!cache[topic]){
cache[topic] = [];
}
if(!cache[topic][priority]){
cache[topic][priority] = [];
}
cache[topic][priority].push(callback);
return [topic, callback, priority]; // Array
};
// the priority that a subscription should use if one is not provided
d.subscribe.default_priority = 10;
d.unsubscribe = function(/* Array */handle){
// summary:
// Disconnect a subscribed function for a topic.
// handle: Array
// The return value from a $.subscribe call.
// example:
// | var handle = $.subscribe("/something", function(){});
// | $.unsubscribe(handle);
// | var handle = $.subscribe("/something", 20, function(){});
// | $.unsubscribe(handle);
var t = handle[0],
p = handle[2];
cache[t] && cache[t][p] && d.each(cache[t][p], function(idx){
if(this == handle[1]){
cache[t][p].splice(idx, 1);
}
});
};
})(jQuery);