Skip to content

Commit

Permalink
Fix sparse array handling in EventEmitter#listeners() (#24546)
Browse files Browse the repository at this point in the history
Summary:
Fixes a regression in 1f8b46a. The internal subscription vendor uses a sparse array to track listeners, which makes listener removal fast. When querying listeners, the sparse entries need to be removed. `Array#filter` is a built-in way to do this -> linked to the JS spec, which explains this.

[General] [Fixed] - Fixed sparse array handling in `EventEmitter#listeners()`
Pull Request resolved: #24546

Differential Revision: D15044790

Pulled By: cpojer

fbshipit-source-id: 0f1301618739357b4a0f5378b9584efe74f0f09a
  • Loading branch information
ide authored and facebook-github-bot committed Apr 23, 2019
1 parent 1f6de88 commit b76acd3
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion Libraries/vendor/emitter/EventEmitter.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ const EventSubscriptionVendor = require('EventSubscriptionVendor');

const invariant = require('invariant');

const sparseFilterPredicate = () => true;

/**
* @class EventEmitter
* @description
Expand Down Expand Up @@ -151,7 +153,13 @@ class EventEmitter {
listeners(eventType: string): [EmitterSubscription] {
const subscriptions = this._subscriber.getSubscriptionsForType(eventType);
return subscriptions
? subscriptions.map(subscription => subscription.listener)
? subscriptions
// We filter out missing entries because the array is sparse.
// "callbackfn is called only for elements of the array which actually
// exist; it is not called for missing elements of the array."
// https://www.ecma-international.org/ecma-262/9.0/index.html#sec-array.prototype.filter
.filter(sparseFilterPredicate)
.map(subscription => subscription.listener)
: [];
}

Expand Down

0 comments on commit b76acd3

Please sign in to comment.