发货订单应该是什么样的:
;; 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
才能完成更新。
答案 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 值。