@Drovosek01

Как в rxjs выполнить 2 запроса подряд и обработать результаты только первого?

Есть 2 запроса на бэкенд. Для выполнения второго запроса нужен результат выполнения первого запроса.
После выполнения обоих запросов нужно выполнить функцию, в которую нужно передать опять таки результаты выполнения первого запроса.

Сейчас это выглядит примерно так:
this.profileDocumentService.getDataOne(profileId, identityTranslationCreateContract).pipe(
  tap((someDataFromOne) => {
    if (someDataFromOne.document) {
      this.documentApiAdapter.getDataTwo(translationResponse.id as number, someDataFromOne.document).subscribe();
    }
  }),
  map((someDataFromOne) => this.mapIdentityTranslationDocument([someDataFromOne]))

но это неправильно, потому что внутри Observable нельзя/очень_плохо делать подписку на другой Observable.

Как сделать подобный запрос правильно, без подписок внутри подписки и чтобы в callback'е внутри map можно было взять результаты первого запроса?
  • Вопрос задан
  • 874 просмотра
Решения вопроса 1
@Drovosek01 Автор вопроса
В общем решил проблему вот такой конструкцией. Может кому-нибудь поможет:

this.profileDocumentService.getDataOne(profileId, identityTranslationCreateContract).pipe(
      switchMap((previousFioResponse) => {
        if (previousFioResponse.document) {
          return this.documentApiAdapter
            .getDataTwo(previousFioResponse.id, previousFioDocument.document)
            .pipe(map(() => this.mapPreviousFioDocument([previousFioResponse])));
        }
        return of(this.mapPreviousFioDocument([previousFioDocument]));
      })
    );
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
zkrvndm
@zkrvndm
Архитектор решений
Чтобы не загромождать код колбеками существуют промисы, используйте их.
Ответ написан
lssssssssssl
@lssssssssssl
Если вас смущает только .subscribe(), сделайте
await firstValueFrom(this.documentApiAdapter.getDataTwo(translationResponse.id as number, someDataFromOne.document)) и не ломайте голову.

rxjs 7+ . Само подписывается, само отписывается.

https://rxjs.dev/api/index/function/firstValueFrom
Ответ написан
Комментировать
Ahmad66617
@Ahmad66617
Senior Fullstack Engineer
Как правильно сказано было выше - насчет коллбэков например и вагона проверок на if-ах - посмотри в сторону exchaustMap - сам юзаю - в эффектах NgRx - когда нужно с бэка дождаться результата и потом что-то делать
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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