Я только начал использовать 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')))
);
)
Вы можете использовать оператор 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 будет применяться для действий с одним и тем же идентификатором.