Я хотел бы отправить действие после того, как первое было обработано редюсерами.

Вот мой вариант использования. Мой компонент позволяет пользователю выбирать список заметок (этот список хранится в редуксе). На основании некоторых действий пользователя из этого списка может быть выбрана случайная заметка и сохранена в магазине.

enter image description here

На скриншоте вы можете видеть кнопки. «Выбрать все» и «Отменить выбор» действуют на список возможных заметок. «Старт» выбрать заметку из списка.

У меня проблема с "кнопкой сброса". Предполагается цепочка «выбрать все» и «начать», и я не знаю, как это сделать. Я попробовал наивно:

const reset = function () {
  dispatch(selectAll());
  dispatch(pickANote());
}

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

Покопавшись в интернете, я нашел только случаи цепочек действий на основе вызовов API с редукционным переходом. У меня проблема в том, что я не знаю, как что-то инициировать при обработке действия (что очевидно при вызове API)

Итак, есть 3 решения:

  • Я упускаю что-то очевидное
  • Я иду туда, куда не ступала нога человека
  • Я делаю что-то против шаблона

Любая помощь приветствуется.

0
Ernest Jones 23 Мар 2020 в 12:35
Вы можете добавить функцию обратного вызова в свое действие, которое вызывается после «выбрать все».
 – 
Fullhdpixel
23 Мар 2020 в 12:40
Что ж, я скорее выберу Promise, но да, это может быть решением... Нет ли более «встроенного» способа?
 – 
Ernest Jones
23 Мар 2020 в 12:41
Вы можете использовать асинхронный водопад: caolan.github.io/async/v3/ docs.html#waterfall, но вам все равно придется добавить функцию обратного вызова, чтобы перейти к следующему шагу.
 – 
Fullhdpixel
23 Мар 2020 в 12:43

1 ответ

Хорошо, я нашел свой ответ.

Неудивительно, я думал об антипаттерне.

В руководстве по стилю redux есть 2 пункта, которые приводят меня к решение.

  1. Настоятельно рекомендуется отправлять одно действие, которое обрабатывается несколькими редьюсерами.
  2. Настоятельно рекомендуется размещать логику внутри редукторов.

Следствием этого является то, что я должен отправлять «необработанные данные», а затем вычислять редукторы значений. Следуя этому пути, я не зависел от значений, уже находящихся в хранилище для следующих обновлений, и поэтому я не сталкивался с какой-либо гонкой данных.

1
Ernest Jones 24 Мар 2020 в 14:09