프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / component-emitter / index.js

이력 | 보기 | 이력해설 | 다운로드 (3.11 KB)

1

    
2
/**
3
 * Expose `Emitter`.
4
 */
5

    
6
if (typeof module !== 'undefined') {
7
  module.exports = Emitter;
8
}
9

    
10
/**
11
 * Initialize a new `Emitter`.
12
 *
13
 * @api public
14
 */
15

    
16
function Emitter(obj) {
17
  if (obj) return mixin(obj);
18
};
19

    
20
/**
21
 * Mixin the emitter properties.
22
 *
23
 * @param {Object} obj
24
 * @return {Object}
25
 * @api private
26
 */
27

    
28
function mixin(obj) {
29
  for (var key in Emitter.prototype) {
30
    obj[key] = Emitter.prototype[key];
31
  }
32
  return obj;
33
}
34

    
35
/**
36
 * Listen on the given `event` with `fn`.
37
 *
38
 * @param {String} event
39
 * @param {Function} fn
40
 * @return {Emitter}
41
 * @api public
42
 */
43

    
44
Emitter.prototype.on =
45
Emitter.prototype.addEventListener = function(event, fn){
46
  this._callbacks = this._callbacks || {};
47
  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])
48
    .push(fn);
49
  return this;
50
};
51

    
52
/**
53
 * Adds an `event` listener that will be invoked a single
54
 * time then automatically removed.
55
 *
56
 * @param {String} event
57
 * @param {Function} fn
58
 * @return {Emitter}
59
 * @api public
60
 */
61

    
62
Emitter.prototype.once = function(event, fn){
63
  function on() {
64
    this.off(event, on);
65
    fn.apply(this, arguments);
66
  }
67

    
68
  on.fn = fn;
69
  this.on(event, on);
70
  return this;
71
};
72

    
73
/**
74
 * Remove the given callback for `event` or all
75
 * registered callbacks.
76
 *
77
 * @param {String} event
78
 * @param {Function} fn
79
 * @return {Emitter}
80
 * @api public
81
 */
82

    
83
Emitter.prototype.off =
84
Emitter.prototype.removeListener =
85
Emitter.prototype.removeAllListeners =
86
Emitter.prototype.removeEventListener = function(event, fn){
87
  this._callbacks = this._callbacks || {};
88

    
89
  // all
90
  if (0 == arguments.length) {
91
    this._callbacks = {};
92
    return this;
93
  }
94

    
95
  // specific event
96
  var callbacks = this._callbacks['$' + event];
97
  if (!callbacks) return this;
98

    
99
  // remove all handlers
100
  if (1 == arguments.length) {
101
    delete this._callbacks['$' + event];
102
    return this;
103
  }
104

    
105
  // remove specific handler
106
  var cb;
107
  for (var i = 0; i < callbacks.length; i++) {
108
    cb = callbacks[i];
109
    if (cb === fn || cb.fn === fn) {
110
      callbacks.splice(i, 1);
111
      break;
112
    }
113
  }
114
  return this;
115
};
116

    
117
/**
118
 * Emit `event` with the given args.
119
 *
120
 * @param {String} event
121
 * @param {Mixed} ...
122
 * @return {Emitter}
123
 */
124

    
125
Emitter.prototype.emit = function(event){
126
  this._callbacks = this._callbacks || {};
127
  var args = [].slice.call(arguments, 1)
128
    , callbacks = this._callbacks['$' + event];
129

    
130
  if (callbacks) {
131
    callbacks = callbacks.slice(0);
132
    for (var i = 0, len = callbacks.length; i < len; ++i) {
133
      callbacks[i].apply(this, args);
134
    }
135
  }
136

    
137
  return this;
138
};
139

    
140
/**
141
 * Return array of callbacks for `event`.
142
 *
143
 * @param {String} event
144
 * @return {Array}
145
 * @api public
146
 */
147

    
148
Emitter.prototype.listeners = function(event){
149
  this._callbacks = this._callbacks || {};
150
  return this._callbacks['$' + event] || [];
151
};
152

    
153
/**
154
 * Check if this emitter has `event` handlers.
155
 *
156
 * @param {String} event
157
 * @return {Boolean}
158
 * @api public
159
 */
160

    
161
Emitter.prototype.hasListeners = function(event){
162
  return !! this.listeners(event).length;
163
};