Реализовать оператор RxJs вместо вложенных блоков подписки

Я получаю id из параметров маршрута и того, что я передаю в мой вызов API. Для этого я сейчас использую вложенную подписку. Но я хочу использовать concat() или, может быть, какой-то другой оператор RxJs(я не знаю, какой), чтобы я мог избежать вложения. Так как документы здесь не дают некоторого примера, который оставил меня в замешательстве относительно того, как я могу использовать это здесь в моем коде.

Ниже приведен код, где реализовано вложение, я хочу реализовать ту же логику, используя concat() или, может быть, какой-то другой оператор RxJs.

this.route.params.subscribe((params: Params) => {
  this.selectedPostId = +params['id'];
  if (this.selectedPostId) {
    // Simple GraphQL API call below
    this.apollo.watchQuery(GetPost, {id: this.selectedPostId})
      .subscribe((post: PostType) => {
        if (post) {
          console.log(post);
        }
      });
  }
});

1 ответ

Решение

Оператор, который вы действительно хотите, это flatMap

import { map, flatMap, filter } from 'rxjs/operators';

// ...


this.route.params.pipe(
        map((params: Params) => +params['id']), // Get the ID param
        filter((selectedPostId: any) => selectedPostId), // Remove any events without an ID
        flatMap(id => this.apollo.watchQuery(GetPost, {id: selectedPostId})) // Call the watchQuery function
    ).subscribe((post: PostType) => {
        if (post) {
          console.log(post);
        }
    });
Другие вопросы по тегам