我正在尝试创建一个重新构建订阅,它从 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
数据库中的更改都会执行整个反应,这会再次执行 rest 调用,从而再次触发反应等等。
我将如何“重新构建方式”解决这个问题?organisation-users
我的一个想法是仅在数据库中尚未填充时才执行其余调用。这可能有效,但我担心如果用户稍后导航到该页面并查看旧数据,或者如果调用不成功并且用户无法通过再次导航到该页面来启动新尝试,我会遇到问题。