从这两个处理程序开始,它们负责获取当前用户信息:
(re-frame/register-handler
:got-user
(fn [db [_ user]]
(assoc db :user user)))
(re-frame/register-handler
:get-user
(fn [db [_]]
(ajax/GET "/user"
{:handler #(re-frame/dispatch [:got-user %1])})
db))在一个页面中,我想显示朋友列表,但问题是它取决于首先获取的用户:
(re-frame/register-handler
:get-friends
(fn [db [_]]
(when (nil? (:user db))
(re-frame/dispatch [:get-user]))
; Here's the problem, as I need to way for get-users and got-users to run.
(ajax/GET (str "/users/" (get-in db [:user :id]))
{:handler #(re-frame/dispatch [:got-friends %1])})
db))我应该如何构造这段代码?
发布于 2017-11-03 15:10:08
First, the documentation specifically warns against creating handlers with side-effects (即从事件处理程序分派事件)。其次,不要尝试重用事件处理程序,而是将可重用的部分重构为helper函数。使用re-frame-http-fx,我会写下这样的代码:
(reg-event-fx
:get-friends
[trim-v]
(fn
[{db :db} [_]]
{:http-xhrio (if (:user db)
{:method :get
:uri (str "/users/" (get-in db [:user :id]))
:on-success [:got-friends]
:on-failure [:get-friends-load-failed]}
{:method :get
:uri "/user"
:on-success [:get-friends-for-user]
:on-failure [:get-friends-user-load-failed]})
:db db}
)):get- friends -for-user将首先存储检索到的用户,并开始获取好友。
发布于 2015-08-13 21:34:28
从我让get-friends调用自身的article about solving the CPU hog problem中获得了一些灵感,虽然用户是nil,但为了避免向服务器发送太多请求,它还添加了一个关于被请求用户的标志:
(re-frame/register-handler
:get-friends
(fn [db [_ user-requested]]
(if-let [user (:user db)]
(ajax/GET (str "/users/" (get-in db [:user :id]))
{:handler #(re-frame/dispatch [:got-friends %1])})
(do
(when (not user-requested)
(re-frame/dispatch [:get-user]))
(re-frame/dispatch [:get-friends true])))
db))它可以工作,但在本地机器上,它会设法调用自己9次左右,直到got user设置了用户。我不确定这是否会是一个问题,如果存在其他解决方案,我也持开放态度。
https://stackoverflow.com/questions/31985649
复制相似问题