-
Notifications
You must be signed in to change notification settings - Fork 1
/
deferredEventEmitter.js
40 lines (32 loc) · 1011 Bytes
/
deferredEventEmitter.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
var Deferred = require('Deferred'),
EventEmitter = require('events').EventEmitter;
function DeferredEventEmitter(){
this._doneEmitter = new EventEmitter();
}
module.exports = DeferredEventEmitter;
DeferredEventEmitter.prototype = new EventEmitter();
DeferredEventEmitter.prototype.done = function(event, listener){
this._doneEmitter.on(event, listener);
};
DeferredEventEmitter.prototype.removeDoneListener = function(event, listener){
this._doneEmitter.removeListener(event, listener);
};
DeferredEventEmitter.prototype.emit = function(event, args){
var _this = this;
var listeners = this.listeners(event),
arg = Array.prototype.slice.call(arguments),
deferreds = [];
if (listeners.length){
listeners.forEach(function(listener){
var d = new Deferred();
deferreds.push(d);
arg[0] = d.resolve;
listener.apply(_this, arg);
});
Deferred.when.apply(Deferred, deferreds).done(function(){
_this._doneEmitter.emit(event);
});
} else {
_this._doneEmitter.emit(event);
}
};