Бесконечный цикл для четкого эпического действия

Я использую redux-observable для обработки асинхронного действия redux.

Мне нужно очистить состояние модуля по id.

Это мой clearModuleByIdEpic:

const clearModuleByIdEpic = (action$: ActionsObservable<any>) => {
  return action$.ofType(t.CLEAR_MODULE_BY_ID)
    .map((action: IActionPayload<any>): string => action.payload.id)
    .map(clearModuleById);
}

Это мой компонентный метод: вызовите действие clearModuleById.

 private onClear(id: string) {
    this.props.clearModuleById(id);
  }

Но когда я нажимаю кнопку удаления, вызывается событие щелчка onClear.

Это запускает бесконечный цикл для действия clearModuleById.

Я сделал ошибки?


person slideshowp2    schedule 20.07.2017    source источник


Ответы (1)


Похоже, вы отправляете одно и то же действие из эпика, которое вы фильтруете в этом эпике. Это всегда* будет приводить к бесконечным циклам. Вам нужно всегда либо А) отправлять другое действие, либо Б) не отправлять ничего другого в эпике после срабатывания соответствующего побочного эффекта.

Также не похоже, что ваш эпик на самом деле делает что-то, кроме синхронной повторной отправки одного и того же действия. Эпики в redux-observable позволяют вам выполнять 1 или более (а) синхронных побочных эффектов для действия.

Вообще говоря, вы не должны повторно отправлять одно и то же действие из эпика, если вы не делаете это с какой-либо формой аварийного люка. Фактически это форма рекурсии, к которой применимы все обычные рекурсивные проблемы. Неспособность выйти из рекурсии означает бесконечный цикл.

*Есть исключения, но это верно в 99,99% случаев.

person meticoeus    schedule 20.07.2017
comment
Также хочу добавить, что это, вероятно, связано с небольшим непониманием того, как работает redux-observable — ваши эпики получают действия после того, как они уже достигли редюсеров, поэтому, как уже упоминалось, нет необходимости повторно отправлять входящие действия. Концептуально, мне нравится думать о ваших эпопеях, как о параллельном дублировании. Они не могут проглотить или каким-либо иным образом предотвратить нормальную редукс-вещь, они могут только прослушивать действия и, при желании, решать выполнять другие действия в какой-то момент, обычно после выполнения побочных эффектов. - person jayphelps; 20.07.2017