Карта наблюдаемой массива с использованием наблюдаемой - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь найти способ заставить этот сценарий работать:

  • У меня есть наблюдаемое talks$, которое выдает список всех разговоров.
  • У разговора есть свойствоpersonId
  • Это свойство может быть сопоставлено с человеком с помощью Observable.
  • Я пытаюсь сопоставить его с классом TalkWithPerson

const test = this.talks$.pipe(
  exhaustMap(talks =>
    talks.map(t => this.getPersonById(t.personId).pipe(map(p => newTalkWithPerson(t, p))))
  ),
);

В настоящее время это излучает 2 наблюдаемых, каждый из которых излучает мой TalkWithPerson объект.(Observable<Observable<TalkWithPerson>>)

Я хотел бы получить Observable<TalkWithPerson[]>, если это возможно.

Я думал о том, чтобы идти трудным путем, чтобы собрать всех людей и все разговоры и использовать combineLatestс функцией проекта для сопоставления записей, но я не хочу загружать всех людей, это приведет к загрузке огромного списка ...

Спасибо за вашу помощь!

StackBlitz: https://stackblitz.com/edit/talks-person

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Попробуйте это:

const test = this.talks$.pipe(
    exhaustMap(talks =>
        from(talks)
            .pipe(
                mergeMap(t => this.getPersonById(t.personId).pipe(map(p => newTalkWithPerson(t, p)))),                  
                toArray())
            )
  ),
);
  • Импорт from в качестве метода создания import { from } from "rxjs";
  • Импорт toArray такой же, как и для конвейерного оператора 'map'
0 голосов
/ 26 августа 2018

Используйте для этого оператор flatMap. flatMap развернет Observable<Observable<TalkWithPerson[]>> в Observable<TalkWithPerson[]>

Итак, попробуйте сделать это:

const test = this.talks$.pipe(
  exhaustMap(talks =>
    talks.flatMap(t => this.getPersonById(t.personId).pipe(map(p => newTalkWithPerson(t, p))))
  ),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...