Skip to content

Commit

Permalink
Add a removeListener method to DeviceEventEmitter for Framework consi…
Browse files Browse the repository at this point in the history
Summary:
The Framework is inconsistent in how listeners are removed in certain classes. This issue has been discussed in #6493.

For example,

**DeviceEventEmitter**

```javascript
/* Current */
this.keyboardHideObserver = DeviceEventEmitter.addListener('keyboardWillHide', this.keyboardWillHide);
this.keyboardHideObserver.remove();

/* Expected (maybe in addition to the current API) */
DeviceEventEmitter.addListener('keyboardWillHide', this.keyboardWillHide);
DeviceEventEmitter.removeListener('keyboardWillHide', this.keyboardWillHide);
```
**AppStateIOS**

```javascript
AppStateIOS.addEventListener('change', this.handleAppStateChange);
AppStateIOS.removeEventListener('change', this.handleAppStateChange);
```

The API should be consistent, and preferably should allow both ways of removing the listeners.

Currently, developers who tried to use the second way of removing the listeners get an error for function not found. Due to the lack of documenta
Closes #6884

Differential Revision: D3341235

Pulled By: nicklockwood

fbshipit-source-id: 87431e8b667f46ad002d4a6e3ca07cbc1e6b4007
  • Loading branch information
Rahul Jiresal authored and Facebook Github Bot 4 committed May 24, 2016
1 parent 986f67a commit 0e8c3ff
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Libraries/EventEmitter/EventEmitter.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,34 @@ class EventEmitter {
this._currentSubscription = null;
}
}

/**
* Removes the given listener for event of specific type.
*
* @param {string} eventType - Name of the event to emit
* @param {function} listener - Function to invoke when the specified event is
* emitted
*
* @example
* emitter.removeListener('someEvent', function(message) {
* console.log(message);
* }); // removes the listener if already registered
*
*/
removeListener(eventType: String, listener) {
const subscriptions: ?[EmitterSubscription] = (this._subscriber.getSubscriptionsForType(eventType): any);
if (subscriptions) {
for (let i = 0, l = subscriptions.length; i < l; i++) {
const subscription = subscriptions[i];

// The subscription may have been removed during this event loop.
// its listener matches the listener in method parameters
if (subscription && subscription.listener === listener) {
subscription.remove();
}
}
}
}
}

module.exports = EventEmitter;

0 comments on commit 0e8c3ff

Please sign in to comment.