Общий эпос с использованием Redux-Observable

1

Я только начал использовать Redux-Observable. Я хочу создать общий эпик, который запрашивает данные с сервера. Я хочу, чтобы несколько запросов с одинаковым действием и id были отклонены. Однако я не уверен, как это сделать, не создавая нескольких эпос.

const TYPE_IFEXISTS_REQUEST = 'IFEXISTS_REQUEST';
export const IFEXISTS_REQUEST = (id, value) =>
  ({ type: TYPE_IFEXISTS_REQUEST, id, value });
export const IFEXISTS_EPIC = action$ =>
  action$
    .ofType(TYPE_IFEXISTS_REQUEST)
    .debounceTime(5000) // ERROR: debounces based on action type and not id
    .mergeMap(action =>
      fromPromise(api.get('/api/exists/${action.id}/${action.value}'))
        .map(({ data }) => IFEXISTS_SUCCESS(action.id, data))
        .catch(() => of(IFEXISTS_FAILURE(action.id, 'Server error'))));

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


Обновление: никогда не знал о GroupBy. Он отлично работал с коммутатором. Я использовал следующее.

action$
    .ofType(TYPE_IFEXISTS_REQUEST)
    .groupBy(action => action.id)
    .mergeMap(actionByIdGroup$ => 
        actionByIdGroup$
            .debounceTime(5000) // debounces based on action id
            .switchMap(action =>
                fromPromise(api.get('/api/exists/${action.id}/${action.value}'))
                    .map(({ data }) => IFEXISTS_SUCCESS(action.id, data))
                    .catch(() => of(IFEXISTS_FAILURE(action.id, 'Server error')))
            );
    )
Теги:
rxjs
redux
rxjs5
redux-observable

1 ответ

3
Лучший ответ

Вы можете использовать оператор groupBy:

  action$
    .ofType(TYPE_IFEXISTS_REQUEST)
    .groupBy(action => action.id)
    .mergeMap(actionByIdGroup$ => 
        actionByIdGroup$
            .debounceTime(5000) // debounces based on action id
            .mergeMap(action =>
                fromPromise(api.get('/api/exists/${action.id}/${action.value}'))
                    .map(({ data }) => IFEXISTS_SUCCESS(action.id, data))
                    .catch(() => of(IFEXISTS_FAILURE(action.id, 'Server error')))
            );
    )

ActionByIdGroup $ является групповым наблюдаемым из тех же идентификаторов действий. Смысл, только действия с одним и тем же идентификатором будут частью одного и того же потока. В этом случае debounceTime будет применяться для действий с одним и тем же идентификатором.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню