Как сделать два запроса внутри одного epi c [redux-observable]? - PullRequest
0 голосов
/ 23 марта 2020

Я очень новичок в rx js и могу наблюдать за редуксом. Я пытаюсь сделать два ajax запроса в одном epi c примерно так:

import { mergeMap, filter, map, catchError } from 'rxjs/operators';
import { of } from 'rxjs';
import { ofType } from 'redux-observable';
import { push } from 'connected-react-router';

export const doSomething = (action$: any, state$: any) =>
  action$.pipe(
    ofType('SOMETHING_HAPPEND'),
    filter((action: any) => action.payload.status === 'SOME_ACTION'),
    mergeMap(() =>
      ajax.getJSON('/api/somewhere').pipe(
        map(() => push('some_route')),
        catchError((error: ResponseError) => of(statusChangeError(error)))
      )
    ),
    filter(() => {
      const { startTime, endTime } = getFormData(state$.value);
      return startTime && endTime;
    }),
    mergeMap(() =>
      ajax({
        url: './api/another',
        method: 'POST',
        body: getFormData(state$.value),
      }).pipe(
        map(() => push('another_route')),
        catchError((error: ResponseError) => of(statusChangeError(error)))
      )
    )
  );

Первый запрос должен всегда выполняться. Второй запрос условный, для этого у меня есть filter. Я не уверен, что это правильный способ делать такие вещи. кажется, что работает, за исключением того, что эта часть

map(() => push('some_route')),

в первом mergeMap не вызывается. Та же самая часть во втором mergeMap работает нормально.

Что я делаю не так?

1 Ответ

0 голосов
/ 24 марта 2020

Запрос к /api/somewhere выдает ошибку. Ваш catchError приводит к выводу результата statusChangeError(error) из наблюдаемой педы mergeMap. Поскольку последующий оператор фильтра игнорирует выданное значение, ему все равно, является ли значение ошибкой. Таким образом, если ваш предикат фильтра пройдет, второй mergeMap получит событие.

Я бы не советовал использовать filter и map, как вы сейчас, особенно filter. Ваша функция отображения игнорирует испускаемое значение и, похоже, каждый раз возвращает undefined. Если вы хотите вызвать побочный эффект при выдаче значения, используйте оператор tap.

Аналогично, ваш предикат фильтра игнорирует испускаемое значение и вместо этого проверяет некоторое внешнее состояние. Подобные конструкции сделают вашу программу труднее рассуждать. Чем более «чистыми» вы можете сделать наблюдаемые (например, излучать неизменяемые значения), тем более тестируемым и разумным будет ваш код.

...