Цель этого фрагмента кода - сохранить несколько наблюдаемых в массив и объединить их в одну наблюдаемую.
Я пытался использовать forkjoin, а также добавить обертку () вокруг наблюдаемой, прежде чем нажатьих в массив.
// standard index call that returns an observable<Model[]>
index(params?: IndexParameters): Observable<Model[]> {
return this.afStore.collection<Model>(
this.path, ref => {
let query: firebase.firestore.CollectionReference | firebase.firestore.Query = ref;
if (!params)
return query;
if (params.limit)
query = query.limit(params.limit);
if (params.orderBy)
query = query.orderBy(params.orderBy, params.orderDirection || 'asc');
_.forEach(params.where, (v: CollectionWhere) => {
query = query.where(v.fieldPath, v.operation, v.value);
});
return query;
}).snapshotChanges()
.pipe(map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return {id, ...data};
});
}),
catchError(e => {
FirebaseService.handleError(e);
return throwError(e);
}));
}
// store multiple observable<Model[]> into an array and keep entries that is present on all observable response
indexIntersection(ids: string[], fieldPath: string = 'id', intersectionBy: string = 'id'): Observable<Model[]> {
const observables: Observable<Model[]>[] = [];
_.forEach(ids, (v: string) => {
observables.push(
this.index({
where: [{
fieldPath: fieldPath,
operation: '==',
value: v
}]
}).pipe(take(1)));
});
return combineLatest(...observables).pipe(
take(1),
map((res: Model[][]) => {
return _.intersectionBy(...res, intersectionBy);
})
);
}
combLatest приведет к следующей ошибке:
TypeError: Вы указали недопустимый объект, где ожидался поток.Вы можете предоставить Observable, Promise, Array или Iterable