VK_31
@VK_31
Постоянно учусь

Как лучше выполнить объединение (merge) запросов по условию?

Добрый день.
Суть вопроса вот в чем:
1. Выполняется запрос на сервер post = getPostByName(name)
2. По id поста выполняется поиск тегов post.tags = getTagsByPostId(post.id)
3. Если у поста есть комментарии, выполняется поиск комментариев post.comments = post.hasComments ? getCommentsByPostId(post.id) : null

Если первые два пункта можно выполнить через mergeMap, то третий пункт непонятно как решить.

this.postService.getPostByName(name)
.pipe(
  mergeMap( 
    post => this.postService.getTagsByPostId(post.id),
      (post, tags) => {
        post.tags = tags;
        return post;
    }
),
.subscribe( post => {
  this.posts.push(new Post(post));
});


Как лучше добавить еще один запрос по условию и дождаться его выполнения? Проблема в том, что все данные должны поступить в конструктор уже сформированные, т.е. необходимо дождаться выполнения двух (или трех) запросов перед передачей в конструктор new Post(post)
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
Ну что-то вроде этого
this.postService.getPostByName(name).pipe(
  mergeMap(post => forkJoin([
    of(post),
    this.postService.getTagsByPostId(post.id),
    iif(() => post.hasComments(), this.getCommentsByPostId(post.id), of(null)),
  ]))
)
  .subscribe(([post, tags, comments]) => {...})


Составляющие лучше вынести в кастомные операторы, чтобы код можно было читать
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@msdosx86
this.postService.getPostByName(name)
  .pipe(
    switchMap(post => this.postService.getTagsByPostId(post.id)
      .pipe(
        tap(tags => post.tags = tags),
        mapTo(post),
        filter(() => post.hasComments),
        switchMap(() => this.postService.getCommentsByPostId(post.id)),
        tap(comments => post.comments = comments),
        mapTo(post),
      )
    ),
  )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект