Прошу прощения, что встреваю в обсуждение.
Первое, на что прошу обратить внимание: никогда не нужно допускать подобных конструкций, когда из subscribe или tap идет запись данный в текущий контекст. Например, когда делается
subscribe((data) => this.data = data)this.data = data).
Второе, не надо делать подписки в подписке. Когда делается любая подписка, то необходимо позаботиться, чтобы ее уничтожить. Например,
.subscribe((data) => smth.subscribe(() => …)).
И вот как решить эти проблемы.
Не делайте подписок. Даже если очень хочется, старайтесь их избегать. Да, есть ситуации, когда необходимо сделать их, но в данном случае она не требуется.
https://t.me/angular_fox/81Используйте AsyncPipe для того, чтобы минимизировать количество необходимых подписок. Тут потребуется понимание, что такое
multicasting.
https://t.me/angular_fox/73Используйте switchMap, mergeMap, concatMap, exhaustMap, чтобы не делать внутренних подписок. Это 4 разные стратегии работы с вложенными потоками.
https://t.me/angular_fox/96https://blog.angularindepth.com/11e5b2efe293И самое главное, работая с RxJS всегда необходимо оперировать потоками.
Теперь, учитывая все выше перечисленное, итоговый код может выглядеть следующим образом:
user: Observable<User> =
userService.getUser().pipe(
filter(notNull));
userId: Observable<number> =
user.pipe(
pluck(‘id’));
userInfo: Observable<UserInfo> =
userId.pipe(
switchMap((userId) => userService.getUser(userId)));
И все что осталось сделать, это отобразить пользователя в шаблоне, если требуется. Просто воспользуемся AsyncPipe, и выведем в виде json:
<pre>{{ userInfo | async | json }}</pre>