Fix for #532
This commit is contained in:
parent
9a17379e0e
commit
07204789f0
|
@ -736,14 +736,15 @@ export default class Reference extends ReferenceBase {
|
|||
// remove the callback.
|
||||
// Remove only a single registration
|
||||
if (eventType && originalCallback) {
|
||||
const registrations = this._syncTree.getRegistrationsByPathEvent(this.path, eventType);
|
||||
const registration = this._syncTree.getOneByPathEventListener(this.path, eventType, originalCallback);
|
||||
if (!registration) return [];
|
||||
|
||||
// remove the paired cancellation registration if any exist
|
||||
this._syncTree.removeListenersForRegistrations([`${registrations[0]}$cancelled`]);
|
||||
this._syncTree.removeListenersForRegistrations([`${registration}$cancelled`]);
|
||||
|
||||
// remove only the first registration to match firebase web sdk
|
||||
// call multiple times to remove multiple registrations
|
||||
return this._syncTree.removeListenerRegistrations(originalCallback, [registrations[0]]);
|
||||
return this._syncTree.removeListenerRegistrations(originalCallback, [registration]);
|
||||
}
|
||||
|
||||
// Firebase Docs:
|
||||
|
|
|
@ -11,6 +11,7 @@ type Registration = {
|
|||
once?: Boolean,
|
||||
appName: String,
|
||||
eventType: String,
|
||||
listener: Function,
|
||||
eventRegistrationKey: String,
|
||||
ref: DatabaseReference,
|
||||
}
|
||||
|
@ -197,6 +198,28 @@ export default class SyncTree {
|
|||
return Object.keys(this._tree[path][eventType]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a single registration key for the specified path, eventType, and listener
|
||||
*
|
||||
* @param path
|
||||
* @param eventType
|
||||
* @param listener
|
||||
* @return {Array}
|
||||
*/
|
||||
getOneByPathEventListener(path: string, eventType: string, listener: Function): Array {
|
||||
if (!this._tree[path]) return [];
|
||||
if (!this._tree[path][eventType]) return [];
|
||||
|
||||
const registrationsForPathEvent = Object.entries(this._tree[path][eventType]);
|
||||
|
||||
for (let i = 0; i < registrationsForPathEvent.length; i++) {
|
||||
const registration = registrationsForPathEvent[i];
|
||||
if (registration[1] === listener) return registration[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a new listener.
|
||||
|
@ -211,8 +234,8 @@ export default class SyncTree {
|
|||
if (!this._tree[path]) this._tree[path] = {};
|
||||
if (!this._tree[path][eventType]) this._tree[path][eventType] = {};
|
||||
|
||||
this._tree[path][eventType][eventRegistrationKey] = 0;
|
||||
this._reverseLookup[eventRegistrationKey] = Object.assign({}, parameters);
|
||||
this._tree[path][eventType][eventRegistrationKey] = listener;
|
||||
this._reverseLookup[eventRegistrationKey] = Object.assign({ listener }, parameters);
|
||||
|
||||
if (once) {
|
||||
INTERNALS.SharedEventEmitter.once(
|
||||
|
|
Loading…
Reference in New Issue