clojure - 如何让处理程序在重新框架中按顺序运行?

标签 clojure re-frame

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

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

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

最佳答案

First, the documentation specifically warns against creating handlers with side-effects (即从事件处理程序调度事件)。其次,不要尝试重用事件处理程序,而是将可重用部分重构为辅助函数。使用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 然后将首先存储检索到的用户并开始获取好友。

关于clojure - 如何让处理程序在重新框架中按顺序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31985649/

相关文章:

error-handling - 如何在 ClojureScript 错误消息中找到我自己的函数?

clojurescript - re-frame:调度后重置原子

clojurescript/reagent for function 不起作用

clojurescript - 重构中的嵌套组件未更新

python - 如何在运行时配置 Clojure 库?

java - 是否有 Clojure 或 Scala 的持久不可变 vector 的 Java 版本?

clojure - 如果在运行时替换函数,Clojure/JVM 是否会 GC 旧代码?

java - 无法在类路径上找到 apply/clojure/core/vector__init.class 或 apply/clojure/core/vector.clj

clojure - 重新构建数据库组织

clojure - 从对 Pedestal 的 POST 请求获取 POST 正文数据