最后一个调度链完成后发货

时间:2018-04-20 14:28:22

标签: clojurescript reagent re-frame

发货订单应该是什么样的:

;; 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 个答案:

答案 0 :(得分: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 值。