ClojureScript试剂组件不断刷新,导致许多POST调用

ClojureScript试剂组件不断刷新,导致许多POST调用,clojure,clojurescript,Clojure,Clojurescript,我已经试着修复这个错误有一段时间了,但我还是没有解决。这个问题与for循环有关,因为当我删除它时,对组件的调用被限制为一个,但随着它不断被调用。这将导致无限次的POST调用,我希望消除这些调用。简言之,组件将不断呈现,而不是仅在加载页面时呈现 (defn get-messages [] "Gets the messages from the server" (let [response (r/atom "")] (fn [] (POST "/get" {:handle

我已经试着修复这个错误有一段时间了,但我还是没有解决。这个问题与for循环有关,因为当我删除它时,对组件的调用被限制为一个,但随着它不断被调用。这将导致无限次的POST调用,我希望消除这些调用。简言之,组件将不断呈现,而不是仅在加载页面时呈现

(defn get-messages []
  "Gets the messages from the server"
  (let [response (r/atom "")]
    (fn []
      (POST "/get" {:handler #(reset! response %)})
      [:div
       (for [item @response]
         [:div
          [:h3.you (first item)] 
          [:p (second item)]])])))
我将其称为与任何其他组件一样:

(defn test []
 [:div
  [get-messages]])
post获取的数据非常简单

(["Bill" "What is the weather today?"] ["Jim" "The weather is warm"])
编辑

我意识到我所犯的错误与懒惰的seq无关。很抱歉,不清楚,但错误在于渲染包含帖子的对象。AJAX经常被调用。为了解决这个问题,我包括:

(:require-macros [cljs.core.async.macros :as cam])


 [clojure.core.async :as ac]
然后我在帖子周围用了这个:

(cam/go
  (<! (ac/timeout 500))
  (POST "/ajax/get-message" {:handler #(reset! response %)}))
(cam/go)
(
谢谢大家的耐心

干杯,
Matt

鉴于上下文,有两件事需要解决:

for
返回一个延迟序列。您可能希望结果是一个向量,请尝试以下操作:

(POST "/get" {:handler #(reset! response %)})
(into [:div]
  (vec (for [item @response]
         [:div
          [:h3 (first item)]
          [:p (second item)]])))
....
这将产生以下结构,这是您想要的(由上面的代码生成):

我不确定这是否是问题所在,但这是很好的第一步


第二,您的间距在很多地方都不正确,这可能会导致涉及不匹配参数的细微错误,这可能会导致循环的行为不符合您的预期。在最后一行中,
]]]
应该是
]]]]
,因此,例如,
for
没有关闭。在其他示例中,您缩进
[:div
POST
行之后,当它不应该缩进时,您使用一个空格来表示所有缩进,除了嵌套的向量外,它应该是两个。

这个空格主要是因为我很难在Stackoverflow中用正确的缩进输入它。我会尝试使用vec。@phlie很容易理解,但是如果你希望其他人能够阅读你的代码——关于这一点,我最大的问题是你似乎没有关闭最后一行的
for
循环(你的代码中有9个左参数,只有8个右参数)…不知道这是否是一个复制/粘贴错误,但是…@phlie在再次查看代码后,我意识到我犯了一个错误,并在上面对其进行了修改。以前的结果是一个双嵌套向量,我想,当您想要上面更平坦的结构时。请验证上面的输出是否具有您想要的结构,我认为它确实存在--如果因此,上面的代码现在是正确的。我编辑了间距。谢谢。代码似乎可以工作,但调用次数仍然太多,所以我要为它设置一个超时。我意识到了错误并修复了它,编辑了我的帖子。谢谢你的帮助。
[:div
 [:div [:h3 "Bill"] [:p "What is the weather today?"]]
 [:div [:h3 "Jim"] [:p "The weather is warm"]]]