在Reagent/Clojurescript中保持客户状态最新

Rob*_*fat 8 clojure chord clojurescript reactjs reagent

我不确定最好的方法来解决这个问题:

我有一个我正在编写的Web应用程序,它为许多"Project"对象实现了基本的CRUD功能.因此,用户可以创建他/她自己的项目集.

我编写了一个REST API来添加/删除/列出项目,我编写了一个Reagent前端客户端.正如您所料,客户的项目保存在试剂原子(ratom)中.

这是它变得有趣的地方.

在我看过的所有教程中,它向您展示了如何更新ratom,您的GUI将自动更新.我有,那有效.

我目前正在做的是,在更新客户端状态时,我进行REST POST调用以更新数据库上的服务器状态.

但是,这感觉不对.我现在将状态存储在两个地方:在客户端和服务器上,两者可能不同.

如果我将其实现为一个普通的旧网页,服务器会将页面发送回客户端,其中包含数据库的最新状态.但是,状态已经存在于客户端的ratom中,我不知道应该如何同步它.

初始POST成功后,我应该再次调用服务器(GET请求)吗?这可以取代鼠标的内容.然后我要两个请求......这看起来很浪费.

或者是使用chordsente之类的东西来异步管理客户端状态的最佳实践.这样会更好,因为这意味着来自其他用户的更改将在客户端即时刷新.但是,我看不到任何教程证明与其中任何一个反应,所以也许我在错误的轨道上.

所以问题很简单,一个人应该如何与REST做出反应?

谢谢

sch*_*eho 3

我同意@myguidingstar 的观点,您的问题更多的是客户端-服务器同步,而不是 clojure 或试剂。你可能会遇到类似的问题,例如,使用 GWT(去过那里,...)

在初始 POST 成功后,我是否应该再次调用服务器(GET 请求)?这可以替换比率的内容。然后我提出两个请求......这似乎很浪费。

您似乎错过了 POST 请求也可以触发服务器的响应。

这里最大的问题是为什么需要客户端上的数据库状态?您是否有强制要求尽量减少从服务器获取数据的 GET 请求量?或者您是否在客户端(ClojureScript/reagent)端实现了不需要服务器交互的业务逻辑?您还需要考虑同一问题的另一面:如果您的客户端状态一段时间没有更新是否可以,或者您是否会遇到一致性问题,因为“其他东西”正在修改客户端后面的服务器上的数据后退?

最后你说你

..不知道我应该如何同步它。

你的问题到底是什么?为什么不直接更新应用程序状态(swap! app-state update-in ...)在从服务器获取数据后,如试剂教程中所述?

  • 请参阅此处的讨论:/sf/ask/1343991071/ (2认同)