rxjs: как получить связанные данные из Firestore - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить некоторые связанные данные на основе значений, возвращаемых наблюдаемым из Firestore.

getChampionshipResults(minimumCompetionCount: number): Observable<User[]> {

    const usersWithResults = this.afs.collection<User>('users')
        .valueChanges()
        .map(users => {
            return users.map(user => {
                this.afs.collection<Result>('results', ref => ref
                    .where('userUid', '==', user.uid)
                    .orderBy('position', 'asc')
                    .limit(minimumCompetionCount))
                    .valueChanges()
                    .take(1)
                    .subscribe(results => {
                        user.results = results;
                    });
                return user;
            });
        })
        .do(el => console.log(el));

    return usersWithResults;
}

это дает мне правильные результаты: выход

Но я хочу выполнить расширенную сортировку / фильтрацию на наблюдаемой usersWithResults. Проблема в том, что свойство user.results равно undefined, в то время как я хочу его отсортировать:

getChampionshipResults(minimumCompetionCount: number): Observable<User[]> {

    const usersWithResults = this.afs.collection<User>('users')
        .valueChanges()
        .map(users => {
            return users.map(user => {
                this.afs.collection<Result>('results', ref => ref
                    .where('userUid', '==', user.uid)
                    .orderBy('position', 'asc')
                    .limit(minimumCompetionCount))
                    .valueChanges()
                    .take(1)
                    .subscribe(results => {
                        user.results = results;
                    });
                return user;
            });
        })
        .do(el => console.log(el))

        // add sorting
        .map(users => {
            return users.sort((a, b) => {

                // this is undefined
                console.log(a.results);

                // simplified dummy sort
                return 1;
            });
        });

    return usersWithResults;
}

Я думаю, что проблема связана с тем, что внутренняя наблюдаемая еще не завершена, но я не могу найти правильный оператор rxjs, чтобы делать то, что я хочу.

Любой совет будет оценен. Спасибо.

...