0

调度顺序应如下所示:

;; 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]]

我们无法保证在再次获得 bar 之前更新成功。:http/get-bar可以作为 的一部分进行调度:http-success/update-foo,但是硬编码会使事情变得不那么灵活。在我的特定用例中,我有一个在两个不同页面上使用的模态组件。单击保存时,两者都会发送到,[:http/update-foo]但一个页面会跟进, [:http/get-bar]另一个页面会跟进[:http/get-baz],两者都需要foo先完成更新。

4

1 回答 1

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)}))

异步流对于构建这些依赖项非常强大,允许您使您的各个处理程序免受硬编码(或笨拙的参数化)调度后值的影响。

于 2018-04-20T15:26:39.503 回答