Подписка на вложенные наблюдаемые объекты

У меня есть следующий код:

getUsers() {
    this.af.database.list(DB_URL)
    .map((users) => {
      return users.map((user) => {
        user.data = this.af.database.object(DB_URL_2).take(1);
        return user;
      });
    })
    .take(1)
    .subscribe((itemPrefs) => {
      this.users = users;
    })
  }

Который возвращает массив users, где user.data — наблюдаемое (информация о пользователе).

Как я могу вернуть данные user как объект, а не как наблюдаемый? Я попытался подписаться на свой user.data, но он все еще возвращает наблюдаемое:

return users.map((user) => {
            user.data = this.af.database.object(DB_URL_2).take(1)
.subscribe((data) => {
return data;
});
        return user;
      });

person TheUnreal    schedule 21.11.2016    source источник


Ответы (1)


Я думаю, что selectMany должен помочь, каждая внутренняя функция selectMany(RxJS4) mergeMap(RxJS 5) будет возвращать observable, который будет сглаживаться. Это означает, что он позаботится о том, чтобы все внутренние data были сглажены.

Код

getUsers() {
    this.af.database.list(DB_URL)
    .mergeMap((user, i) => {
        return this.af.database.object(DB_URL_2).take(1).map(data => {
           user.data = data;
           return user;
        });
      });
    })
    .take(1)
    .subscribe((itemPrefs) => {
      this.users = users;
    })
}
person Pankaj Parkar    schedule 21.11.2016
comment
Любая идея, как я могу импортировать оператор selectMany в Angualr 2? Я пробовал import 'rxjs/add/operator/selectMany'; - person TheUnreal; 21.11.2016
comment
@TheUnreal Думаю, это будет import { Observable } from 'rxjs/Observable' - person Pankaj Parkar; 21.11.2016
comment
@TheUnreal извините за неудобства, selectMany использовался в rxjs4, так как мы используем RxJS5, он стал mergeMap. Пожалуйста, дайте мне знать, если это работает для вас. - person Pankaj Parkar; 21.11.2016
comment
@TheUnreal, не могли бы вы подтвердить, работает ли это для вас или нет? - person Pankaj Parkar; 22.11.2016
comment
Спасибо, но в моем первом вызове БД я получаю список пользователей, и у каждого пользователя есть `$key. когда я использую user.$key во втором вызове БД, я получаю property $key does not exists on type all[]. - person TheUnreal; 22.11.2016
comment
Я сделал консольный журнал, оказалось, что user внутри mergeMap представляет собой массив всех пользователей. - person TheUnreal; 22.11.2016
comment
@TheUnreal проблема заключалась в том, что selectMany это был лучший способ справиться с этим в rxjs4, но rxjs5 они сказали, что это будет использоваться как mergeMap в будущем, но это не работает таким образом. Ознакомьтесь с руководством по переходу с rxjs4 на rxjs5. Когда-нибудь углубимся в это - person Pankaj Parkar; 22.11.2016