Skip to content

Commit b85147d

Browse files
cartantdavideast
authored andcommitted
fix(database): use switchMap when a list's query changes (angular#831)
* test(database): add failing test for angular#830 * fix(database): use switchMap Closes angular#830.
1 parent e93959a commit b85147d

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

src/database/firebase_list_factory.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ import { Query, AFUnwrappedDataSnapshot } from '../interfaces';
2525
import { Subscription, Observable, Subject } from 'rxjs';
2626
import { COMMON_CONFIG, ANON_AUTH_CONFIG } from '../test-config';
2727
import { _do } from 'rxjs/operator/do';
28+
import { map } from 'rxjs/operator/map';
2829
import { skip } from 'rxjs/operator/skip';
2930
import { take } from 'rxjs/operator/take';
31+
import { toArray } from 'rxjs/operator/toArray';
3032
import { toPromise } from 'rxjs/operator/toPromise';
3133

3234
const rootDatabaseUrl = COMMON_CONFIG.databaseURL;
@@ -758,6 +760,60 @@ describe('FirebaseListFactory', () => {
758760
});
759761

760762
});
763+
764+
describe('observable queries (issue #830)', () => {
765+
766+
it('should not emit the results of previous queries', (done) => {
767+
768+
questions.$ref.ref.set({
769+
key1: { even: false, value: 1 },
770+
key2: { even: true, value: 2 }
771+
})
772+
.then(() => {
773+
774+
let subject = new Subject<boolean>();
775+
let query = FirebaseListFactory(`${rootDatabaseUrl}/questions`, {
776+
query: {
777+
orderByChild: 'even',
778+
equalTo: subject
779+
}
780+
});
781+
782+
query = map.call(query, (list, index) => {
783+
switch (index) {
784+
case 0:
785+
subject.next(true);
786+
break;
787+
case 1:
788+
questions.$ref.ref.update({
789+
key3: { even: false, value: 3 },
790+
key4: { even: true, value: 4 }
791+
});
792+
break;
793+
default:
794+
break;
795+
}
796+
return list;
797+
});
798+
query = take.call(query, 3);
799+
query = toArray.call(query);
800+
801+
toPromise.call(query).then((emits) => {
802+
expect(emits.map(e => e.map(i => i.$key))).toEqual([
803+
['key1'],
804+
['key2'],
805+
['key2', 'key4']
806+
]);
807+
done();
808+
});
809+
810+
subject.next(false);
811+
})
812+
.catch(done.fail);
813+
});
814+
815+
});
816+
761817
});
762818
});
763819

src/database/firebase_list_factory.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { observeOn } from 'rxjs/operator/observeOn';
66
import { observeQuery } from './query_observable';
77
import { Query, FirebaseListFactoryOpts } from '../interfaces';
88
import * as utils from '../utils';
9-
import { mergeMap } from 'rxjs/operator/mergeMap';
9+
import { switchMap } from 'rxjs/operator/switchMap';
1010
import { map } from 'rxjs/operator/map';
1111

1212
export function FirebaseListFactory (
@@ -32,7 +32,7 @@ export function FirebaseListFactory (
3232

3333
const queryObs = observeQuery(query);
3434
return new FirebaseListObservable(ref, subscriber => {
35-
let sub = mergeMap.call(map.call(queryObs, query => {
35+
let sub = switchMap.call(map.call(queryObs, query => {
3636
let queried: firebase.database.Query = ref;
3737
// Only apply the populated keys
3838
// apply ordering and available querying options

0 commit comments

Comments
 (0)