Реализовать оператор 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);
}
});