Как сгладить массив наблюдаемых с помощью comblatest - PullRequest
0 голосов
/ 01 января 2019

Цель этого фрагмента кода - сохранить несколько наблюдаемых в массив и объединить их в одну наблюдаемую.

Я пытался использовать 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

...