Отправка после окончания последней цепи отправки

Как должен выглядеть порядок отправки:

;; Initial Data
(dispatch [:http/get-bar])
;; We click something to update foo
(dispatch [:http/update-foo])
;; :success handler gets run:
(dispatch [:http-success/update-foo])
;; Foo data influences bar data, we want to get-bar again after foo updates
(dispatch [:http/get-bar])

Если у нас есть что-то вроде этого:

{:on-click
 (fn []
   (dispatch [:http/update-foo])
   (dispatch [:http/get-bar]))}

Заказ действительно будет выглядеть так:

[[:http/get-bar]
 [:http/update-foo]
 [:http/get-bar]
 [:http-success/update-foo]]

Мы не можем гарантировать успешное обновление до того, как снова получим планку. Возможна отправка :http/get-bar как часть :http-success/update-foo, но жесткое кодирование делает вещи менее гибкими. В моем конкретном случае использования у меня есть модальный компонент, который используется на двух разных страницах. При нажатии сохранить оба отправят [:http/update-foo] но одна страница будет следовать с[:http/get-bar] а другой свяжется с [:http/get-baz]оба из которых нужны foo закончить обновление первым.

1 ответ

Решение

Для меня это звучит как то, что вы можете решить с помощью https://github.com/Day8/re-frame-async-flow-fx.

Ваш код может выглядеть примерно так:

(defn modal-flow [dispatch-after]
  {:first-dispatch [:http/update-foo]
   :rules [
     {:when :seen? :events :http/update-foo-success :dispatch [dispatch-after]}
   ]})

(re-frame/reg-event-fx
  :modal-1
  (fn [_ _]
    {:async (modal-flow :get/update-foo)}))

(re-frame/reg-event-fx
  :modal-2
  (fn [_ _]
    {:async (modal-flow :get/update-baz)}))

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

Другие вопросы по тегам