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

#rxjs #race-condition #redux-observable #cancellation

#rxjs #состояние гонки #redux-observable #отмена

Вопрос:

В примерах отмены redux-observable official doc мы сначала фильтруем поток действий action $ по типу, а затем выполняем ajax-вызов с потоком действий другого типа. Я не понимаю, как может быть возможно, чтобы действие $ типа FETCH_USER_CANCELLED проходило через первый фильтр OfType (FETCH_USER).

Вот пример

 const fetchUserEpic = action$ => action$.pipe(
  ofType(FETCH_USER),
  mergeMap(action => race(
    ajax.getJSON(`/api/users/${action.payload}`).pipe(
      map(response => fetchUserFulfilled(response))
    ),
    action$.pipe(
      ofType(FETCH_USER_CANCELLED),
      map(() => incrementCounter()),
      take(1)
    )
  ))
);
  

Почему нам не нужен ‘FETCH_USER_CANCELLED’ при первом фильтре OfType?

 action$.pipe(
  ofType(FETCH_USER, FETCH_USER_CANCELLED),
  ...
  

Было бы благодарно, если бы кто-нибудь мог объяснить.

Ответ №1:

В приведенном выше примере вы используете нефильтрованный action$ поток дважды. ofType(FETCH_USER) Фильтр применяется только к последующим операторам в pipe (он же mergeMap после него).