【发布时间】:2017-10-23 18:11:24
【问题描述】:
我正在尝试创建一个 re-frame 订阅,它从 REST API 而不是本地数据库读取数据并将这些数据保存到数据库中。 REST 调用取决于重新框架数据库中的其他值(想想 API-Key),虽然这些数据在浏览应用程序时可用,但在重新加载时不可用。我正在关注本教程:https://github.com/Day8/re-frame/blob/master/docs/Subscribing-To-External-Data.md#some-code
我的订阅看起来像这样(为了便于阅读,去掉了):
(rf/reg-sub-raw
:organisation-users
(fn [db [_ api-token organisation]]
(when (not (nil? api-token))]
(ajax/GET
(str "/some-url/to/get/users/for/organisation")
{:params {:api-token api-token}
:handler #(rf/dispatch [:organisation-users-change %])
:format (ajax/json-request-format)
:response-format (ajax/json-response-format {:keywords? true})}))
(ratom/make-reaction
(fn [] (:organisation-users @db)))))
订阅通过 API-Key 并从服务器请求组织用户。如果数据库中的organisation-users 发生更改,它会返回一个更新订阅者的响应,这会在其余调用成功后立即发生。
在我的组件中,我订阅了订阅:
(defn organisation-page
[]
(let [api-token (rf/subscribe [:api-token])
organisation-users (rf/subscribe [:organisation-users @api-token])]
(fn []
[:div {:class "columns"}
))); stripped
如果我重新加载页面并在初始化(初始化 api-token)之后让 organisation-page 呈现,则此代码有效。 organisation-page 组件在加载后立即渲染时不起作用,因为 api-token 尚不可用并且它不会再次执行 rest 调用。
我也尝试将整个订阅包装到反应中,但这会导致无限循环,因为每次数据库中 organisation-users 更改时都会执行整个反应,这会再次执行其余调用,从而再次触发反应并以此类推。
我将如何以“重新构建方式”解决这个问题?我的一个想法是仅在 organisation-users 尚未填充到数据库中时才执行其余调用。这可能有效,但我担心如果用户稍后导航到该页面并查看旧数据,或者如果调用不成功并且用户无法通过再次导航到该页面来启动新尝试,我会遇到问题。
【问题讨论】:
标签: clojurescript reagent re-frame