如何在重构应用程序中分派两个相关事件?

问题描述 投票:0回答:2

我正在开发一款带有库存系统的游戏。现在,角色装备和库存在我的数据库中是单独的值。我的问题是,当用户装备一个物品时,我需要从库存中删除该物品并将其添加到角色中。

我现在有这样的事情:

(defn equip-item [item idx]
  (re-frame/dispatch [:equip-item {:position :off-hand :item item}])
  (re-frame/dispatch [:remove-item-from-inventory idx]))

(re-frame/reg-event-db
  :equip-item
  (fn [db [_ itemObj]]
    (update-in db [:character :equipment] merge {(:position itemObj) (:item itemObj)})))

(re-frame/reg-event-db
  :remove-item-from-inventory
  (fn [db [_ idx]]
    (update-in db [:inventory :main] handle-remove idx)))

到目前为止,这工作得很好,但我想知道是否有更好的方法来处理像这样分派多个事件?我知道可以使用

:dispatch-n
键创建效果,但我不确定这在这里是否合适。

无论如何,我也担心一个事件失败而另一个事件成功。它们的行为应该有点像一笔交易,如果其中一个失败,那么它们都应该失败。

clojure clojurescript re-frame
2个回答
0
投票

最好的方法是提取这些

update-in
来分离常规函数,创建必要的第三个事件,并通过例如调用其中的这些函数
->
。当然,您也可以在原始事件中调用这些函数,而不是
update-in


0
投票

不要使用

reg-event-db
,而使用
reg-event-fx
。这将返回效果的哈希值。

这些效果之一可以是

:fx
,它是要调用的其他效果的列表。例如,这些效果可以是调度事件。一些代码:

(rf/reg-event-db
 :print1
 (fn [db]
   (.log js/console "print1!")
   db))

(rf/reg-event-db
 :print2
 (fn [db]
   (.log js/console "print2!")
   db))

(rf/reg-event-fx
 :test-two-dispatch
 (fn [{:keys [db]} _]
   {:db db
    :fx [[:dispatch [:print1]]
         [:dispatch [:print2]]]}))
© www.soinside.com 2019 - 2024. All rights reserved.