Rxjs выполняет последовательные вызовы с использованием concatMap

Я хотел бы сделать два последовательных вызова (если первый завершился, вызовите второй):

Мой код похож на:

        myApiClient
        .firstApiCall()
        .pipe(take(1),
            concatMap (firstResult => {
            doSomethingWithResponse(firstResult);
            return myApiClient.secondApiCall();
        }), take(1))
        .subscribe(secondResult => {
            doSomethingWithResponse(firstResult);
        }, error => {
            catchSecondApiCallError(error);
        });

Первый вопрос: правильно ли это делать последовательные звонки? Второй вопрос: как мне отловить ошибку при первом вызове?


person Jimy Weiss    schedule 27.02.2021    source источник
comment
Что должно произойти, если первое выйдет из строя - вы хотите продолжить работу со вторым в этом случае?   -  person Nicholas K    schedule 27.02.2021
comment
@NicholasK нет, если первый выйдет из строя, второй вызывать не следует (теперь поведение правильное). Я просто хочу обработать ошибку первого.   -  person Jimy Weiss    schedule 27.02.2021


Ответы (1)


Да, это правильный способ связать последовательные вызовы API с помощью rxjs. Для ответа на второй вопрос вы можете использовать оператор catchError.

    myApiClient
    .firstApiCall()
    .pipe(
        take(1),
        catchError(e => {
          console.log('Error caught from first api ', e);
          return EMPTY;
        }),
        concatMap (firstResult => {
          doSomethingWithResponse(firstResult);
          return myApiClient.secondApiCall();
    }), take(1))
    .subscribe(secondResult => {
        doSomethingWithResponse(secondResult);
    }, error => {
        catchSecondApiCallError(error);
    });

EMPTY импортируется из:

import { EMPTY } from 'rxjs';
person Nicholas K    schedule 27.02.2021
comment
Спасибо. Только ради любопытства: есть ли способ продолжить второй вызов, если первый выйдет из строя? - person Jimy Weiss; 27.02.2021
comment
Вы можете попробовать использовать для этого onErrorResumeNext. - person Nicholas K; 27.02.2021