diff --git a/src/database/firebase_list_factory.spec.ts b/src/database/firebase_list_factory.spec.ts index 7786a2ece..2b32a191d 100644 --- a/src/database/firebase_list_factory.spec.ts +++ b/src/database/firebase_list_factory.spec.ts @@ -25,8 +25,10 @@ import { Query, AFUnwrappedDataSnapshot } from '../interfaces'; import { Subscription, Observable, Subject } from 'rxjs'; import { COMMON_CONFIG, ANON_AUTH_CONFIG } from '../test-config'; import { _do } from 'rxjs/operator/do'; +import { map } from 'rxjs/operator/map'; import { skip } from 'rxjs/operator/skip'; import { take } from 'rxjs/operator/take'; +import { toArray } from 'rxjs/operator/toArray'; import { toPromise } from 'rxjs/operator/toPromise'; const rootDatabaseUrl = COMMON_CONFIG.databaseURL; @@ -758,6 +760,60 @@ describe('FirebaseListFactory', () => { }); }); + + describe('observable queries (issue #830)', () => { + + it('should not emit the results of previous queries', (done) => { + + questions.$ref.ref.set({ + key1: { even: false, value: 1 }, + key2: { even: true, value: 2 } + }) + .then(() => { + + let subject = new Subject(); + let query = FirebaseListFactory(`${rootDatabaseUrl}/questions`, { + query: { + orderByChild: 'even', + equalTo: subject + } + }); + + query = map.call(query, (list, index) => { + switch (index) { + case 0: + subject.next(true); + break; + case 1: + questions.$ref.ref.update({ + key3: { even: false, value: 3 }, + key4: { even: true, value: 4 } + }); + break; + default: + break; + } + return list; + }); + query = take.call(query, 3); + query = toArray.call(query); + + toPromise.call(query).then((emits) => { + expect(emits.map(e => e.map(i => i.$key))).toEqual([ + ['key1'], + ['key2'], + ['key2', 'key4'] + ]); + done(); + }); + + subject.next(false); + }) + .catch(done.fail); + }); + + }); + }); }); diff --git a/src/database/firebase_list_factory.ts b/src/database/firebase_list_factory.ts index 275324a1f..0dd296fb5 100644 --- a/src/database/firebase_list_factory.ts +++ b/src/database/firebase_list_factory.ts @@ -6,7 +6,7 @@ import { observeOn } from 'rxjs/operator/observeOn'; import { observeQuery } from './query_observable'; import { Query, FirebaseListFactoryOpts } from '../interfaces'; import * as utils from '../utils'; -import { mergeMap } from 'rxjs/operator/mergeMap'; +import { switchMap } from 'rxjs/operator/switchMap'; import { map } from 'rxjs/operator/map'; export function FirebaseListFactory ( @@ -32,7 +32,7 @@ export function FirebaseListFactory ( const queryObs = observeQuery(query); return new FirebaseListObservable(ref, subscriber => { - let sub = mergeMap.call(map.call(queryObs, query => { + let sub = switchMap.call(map.call(queryObs, query => { let queried: firebase.database.Query = ref; // Only apply the populated keys // apply ordering and available querying options