Реализация отмены с помощью redux-saga

Если действие removeItem(itemId) запускается из пользовательского интерфейса, оно должно сначала удалить соответствующий элемент из состояния, а затем вызвать связанную сагу. Если сага терпит неудачу, она должна сбросить состояние до исходного.

Мне было интересно, можете ли вы добавить информацию к полезной нагрузке действия в редьюсерах, а затем запустить действие failed из саги с той же полезной нагрузкой. Предполагается, что редуктор всегда будет запускаться первым (правда ли это?)


person ankit_m    schedule 30.07.2017    source источник


Ответы (1)


Вы не должны отправлять изнутри вашего редуктора. Работа редукторов состоит в том, чтобы взять текущее состояние, действие и вернуть новое состояние из сокращения двух. Вот и все. То, что вы пытаетесь сделать, может быть достигнуто с помощью следующей стратегии:

  1. Используйте itemId, чтобы получить ссылку на элемент и сохранить его локально.
  2. Действие отправки для удаления товара из магазина на основе идентификатора.
  3. Назовите связанную сагу.
  4. Если это не удается, добавьте локально сохраненный элемент из шага 1 обратно в магазин. В случае успеха удалите ссылку на элемент из шага 1.
person Kyle Richardson    schedule 30.07.2017
comment
@ankit_m Да, именно так я бы поступил в этой ситуации. - person Kyle Richardson; 30.07.2017
comment
Но где хранить удаленные данные? Скажем, два элемента удалены подряд. Где и как хранить удаленные данные, чтобы восстановить в случае сбоя саги? - person ankit_m; 30.07.2017
comment
@ankit_m, прежде чем удалять данные из хранилища, вы получите данные, чтобы хранить их локально за пределами вашего магазина на случай, если вам понадобится повторно добавить их. Вы можете поместить каждый удаленный элемент в массив и удалить их из массива по мере успешного выполнения саги или отправить действия для повторного добавления их в хранилище при сбое саги. В любом случае, после успеха или неудачи саги вы должны удалить локальные данные, связанные с этим itemId. - person Kyle Richardson; 30.07.2017