@kot_matpockuh

RxJs: условный mergeMap в pipe?

Есть у меня такой чудный код:

this.myApi.getSomething(id).pipe(
    shop.isNew
        ? (
              map(tags => ({ ...updatedShop, tags })),
              mergeMap(() =>
                  this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                      map(() => {
                          return {
                              ...updatedShop,
                              tags: shop.tags
                          };
                      })
                  )
              )
          )
        : map(tags => ({ ...updatedShop, tags }))
)


не могу понять как заставить подобное работать: если условие выполняется - вызвать еще второй сервис-метод и запустить кроме `map` - `mergeMap`, иначе - только `map`
это возможно как-то реализовать?
  • Вопрос задан
  • 437 просмотров
Решения вопроса 1
search
@search
мама говорит что я особенный
// Да, сначала мы делаем map, потому что он делается полюбому:

let doSomething$ = this.myApi.getSomething(id).pipe(
  map(tags => ({ ...updatedShop, tags }))
)

// А затем мы делаем mergeMap если понадобится:

if (shop.isNew) {
  doSomething$ = doSomething$.pipe(
    mergeMap(() =>
                  this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                      map(() => {
                          return {
                              ...updatedShop,
                              tags: shop.tags
                          };
                      })
                  )
              )
  )
}

// ну и затем подписываемся на это дело чтоб оно начало работать:

doSomething$.subscribe();


Вам будет значительно легче понять RxJS после просмотра вот этого видео: https://www.youtube.com/watch?v=3LKMwkuK0ZE Оно слега отстало от времени (операторы к обозревателю теперь добавляются через функцию pipe()), но сами принципы, описанные в видео, никуда не делись.

UPD

Если код выше повергает вас в тоску, то можно сделать так:

this.myApi.getSomething(id).pipe(
  map(tags => ({ ...updatedShop, tags })),
  mergeMap((tags) => {
    if (!shop.isNew) {
      return of(tags);
    }
   return this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                      map(() => {
                          return {
                              ...updatedShop,
                              tags: shop.tags
                          };
                      })
                  )
  }),
)


Имеется ввиду, что можно иф вынести в сам mergeMap. И если магаз не новый, то возвращать обзёрвбл от магаза, а если новый, то сделать что-то там еще.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы