Skip to content

Commit

Permalink
Merge pull request #779 from ably/once-array
Browse files Browse the repository at this point in the history
EventEmitter: add EventEmitter#once(event[], ...)
  • Loading branch information
SimonWoolf authored Jul 29, 2021
2 parents eea7588 + 482369d commit 48d6644
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
11 changes: 10 additions & 1 deletion common/lib/util/eventemitter.js
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,16 @@ var EventEmitter = (function() {
} else if(Utils.isEmptyArg(event)) {
this.anyOnce.push(listener);
} else if(Utils.isArray(event)){
throw("Arrays of events can only be used with on(), not once()");
var listenerWrapper = function() {
var args = Array.prototype.slice.call(arguments);
Utils.arrForEach(event, function(ev) {
self.off(ev, listenerWrapper);
});
listener.apply(this, args);
};
Utils.arrForEach(event, function(ev) {
self.on(ev, listenerWrapper);
});
} else {
var listeners = (this.eventsOnce[event] || (this.eventsOnce[event] = []));
listeners.push(listener);
Expand Down
25 changes: 25 additions & 0 deletions spec/realtime/event_emitter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,31 @@ define(['shared_helper', 'chai'], function (helper, chai) {
closeAndFinish(done, realtime);
});

it('arrayOfEventsWithOnce', function (done) {
var realtime = helper.AblyRealtime({ autoConnect: false }),
callbackCalled = 0,
eventEmitter = realtime.connection;

var callback = function (arg) {
callbackCalled += 1;
expect(arg).to.equal('expected');
};

try {
callbackCalled = 0;
eventEmitter.once(['a', 'b', 'c'], callback);
eventEmitter.emit('a', 'expected');
eventEmitter.emit('b', 'wrong');
eventEmitter.emit('c', 'wrong');
expect(callbackCalled).to.equal(1, 'listener called back only once, for the first event emitted');
} catch (err) {
closeAndFinish(done, realtime, err);
return;
}

closeAndFinish(done, realtime);
});

/* check that listeners added in a listener cb are not called during that
* emit instance */
it('listenerAddedInListenerCb', function (done) {
Expand Down

0 comments on commit 48d6644

Please sign in to comment.