Angular - объедините два наблюдаемых результата в один - PullRequest
0 голосов
/ 04 сентября 2018

В моей базе данных есть два узла - один allUsers и один usersChildren.

Например:

allUsers: { user1: {...}, user2: {...}}
usersChildren: { user1: {...} }

В этом случае user1 имеет дочерние данные, а user2 - нет.

Я хочу получить список всех пользовательских объектов, и внутри каждого пользовательского объекта я хочу добавить дочерние данные из узла usersChildren (если он есть).

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

this.af.getObservable(`allUsers`).pipe(map(allUsers =>
    allUsers.map(user => this.af.getObservable(`usersChildren/${user.id}`)))
   .subscribe(allUsersData => this.userList = allUsersData);

Как лучше всего достичь того, чего я желаю?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я бы использовал concat оператор в вашем случае.

Concat объединит две наблюдаемые в объединенную последовательность, но вторая наблюдаемая не начнет излучать, пока не завершится первая.

Пример:

let first = Observable.timer(10,500).map(r => {
  return {source:1,value:r};
}).take(4);
let second = Observable.timer(10,500).map(r => {
  return {source:2,value:r};
}).take(4);
first.concat(second).subscribe(res => this.concatStream.push(res));
0 голосов
/ 04 сентября 2018

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

this.af.getObservable(`allUsers`)
  .pipe(
    mergeMap(users => forkJoin(
      users.map(user => this.af.getObservable(`usersChildren/${user.id}`))
    ))
  );

Вы делаете HTTP-вызов, чтобы получить всех пользователей, затем вы используете forkJoin, чтобы сделать 1 звонок на пользователя. Вызов осуществляется благодаря Array.map, который превращает вашего пользователя в вызов HTTP.

Теперь вы можете подписаться на него вот так

this.myService.getAllUsers().subscribe(users => { console.log(users); });
...