-
Notifications
You must be signed in to change notification settings - Fork 24.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed NativeEventListener deregistration
Summary: The `EmitterSubscription.remove()` method was previously calling `this.subscriber.removeSubscription(this)` directly, bypassing the mechanism in `NativeEventEmitter` that keeps track of the number of subscriptions. This meant that native event modules (subclasses of `RCTEventEmitter`) would keep sending events even after all the listeners had been removed. This wasn't a huge overhead, since these modules are singletons and only send one message over the bridge per event, regardless of the number of listeners, but it's still undesirable. This fixes the problem by routing the `EmitterSubscription.remove()` method through the `EventEmitter` so that `NativeEventEmitter` can apply the additional native calls. I've also improved the architecture so that each `NativeEventEmitter` uses its own `EventEmitter`, but they currently all still share the same `EventSubscriptionVendor` so that legacy code which registers events via `RCTDeviceEventEmitter` still works. Reviewed By: vjeux Differential Revision: D3292361 fbshipit-source-id: d60e881d50351523d2112473703bea826641cdef
- Loading branch information
1 parent
9a899be
commit 516bf7b
Showing
15 changed files
with
306 additions
and
254 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
/** | ||
* Copyright (c) 2015-present, Facebook, Inc. | ||
* All rights reserved. | ||
* | ||
* This source code is licensed under the BSD-style license found in the | ||
* LICENSE file in the root directory of this source tree. An additional grant | ||
* of patent rights can be found in the PATENTS file in the same directory. | ||
* | ||
* @providesModule EmitterSubscription | ||
* @noflow | ||
* @typechecks | ||
*/ | ||
'use strict'; | ||
|
||
const EventSubscription = require('EventSubscription'); | ||
|
||
import type EventEmitter from 'EventEmitter'; | ||
import type EventSubscriptionVendor from 'EventSubscriptionVendor'; | ||
|
||
/** | ||
* EmitterSubscription represents a subscription with listener and context data. | ||
*/ | ||
class EmitterSubscription extends EventSubscription { | ||
|
||
emitter: EventEmitter; | ||
listener: Function; | ||
context: ?Object; | ||
|
||
/** | ||
* @param {EventEmitter} emitter - The event emitter that registered this | ||
* subscription | ||
* @param {EventSubscriptionVendor} subscriber - The subscriber that controls | ||
* this subscription | ||
* @param {function} listener - Function to invoke when the specified event is | ||
* emitted | ||
* @param {*} context - Optional context object to use when invoking the | ||
* listener | ||
*/ | ||
constructor( | ||
emitter: EventEmitter, | ||
subscriber: EventSubscriptionVendor, | ||
listener: Function, | ||
context: ?Object | ||
) { | ||
super(subscriber); | ||
this.emitter = emitter; | ||
this.listener = listener; | ||
this.context = context; | ||
} | ||
|
||
/** | ||
* Removes this subscription from the emitter that registered it. | ||
* Note: we're overriding the `remove()` method of EventSubscription here | ||
* but deliberately not calling `super.remove()` as the responsibility | ||
* for removing the subscription lies with the EventEmitter. | ||
*/ | ||
remove() { | ||
this.emitter.removeSubscription(this); | ||
} | ||
} | ||
|
||
module.exports = EmitterSubscription; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.