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

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

;; 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 для завершения обновления в первую очередь.


person deadghost    schedule 20.04.2018    source источник


Ответы (1)


Мне кажется, что это можно решить с помощью 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)}))

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

person Kenneth Kalmer    schedule 20.04.2018