首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让处理程序在重新帧中按顺序运行?

如何让处理程序在重新帧中按顺序运行?
EN

Stack Overflow用户
提问于 2015-08-13 18:28:16
回答 2查看 856关注 0票数 3

从这两个处理程序开始,它们负责获取当前用户信息:

代码语言:javascript
复制
(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))

在一个页面中,我想显示朋友列表,但问题是它取决于首先获取的用户:

代码语言:javascript
复制
(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))

我应该如何构造这段代码?

EN

回答 2

Stack Overflow用户

发布于 2017-11-03 15:10:08

First, the documentation specifically warns against creating handlers with side-effects (即从事件处理程序分派事件)。其次,不要尝试重用事件处理程序,而是将可重用的部分重构为helper函数。使用re-frame-http-fx,我会写下这样的代码:

代码语言:javascript
复制
(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将首先存储检索到的用户,并开始获取好友。

票数 2
EN

Stack Overflow用户

发布于 2015-08-13 21:34:28

从我让get-friends调用自身的article about solving the CPU hog problem中获得了一些灵感,虽然用户是nil,但为了避免向服务器发送太多请求,它还添加了一个关于被请求用户的标志:

代码语言:javascript
复制
(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设置了用户。我不确定这是否会是一个问题,如果存在其他解决方案,我也持开放态度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31985649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档