ClojureScript Reagent组件不断刷新导致许多POST调用

时间:2016-09-21 11:18:16

标签: clojure clojurescript

我一直试图修复此错误一段时间,但它让我望而却步。这个问题与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]])

帖子获取的数据只是

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

修改

我意识到我所犯的错误与懒惰的seq无关。很抱歉不清楚,但错误是渲染一个带有POST的对象。 AJAX不断被调用。要修复它,我包括:

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


 [clojure.core.async :as ac]

然后我在POST周围使用了这个:

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

感谢大家的耐心等待。

干杯, 马特

1 个答案:

答案 0 :(得分:1)

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

for返回一个懒惰的序列。你可能希望结果是一个向量,所以试试这个:

(POST "/get" {:handler #(reset! response %)})
(into [:div]
  (vec (for [item @response]
         [:div
          [:h3 (first item)]
          [:p (second item)]])))
....

这将产生以下结构,这是您想要的(从上面的代码中打印出来):

[:div
 [:div [:h3 "Bill"] [:p "What is the weather today?"]]
 [:div [:h3 "Jim"] [:p "The weather is warm"]]]

我不确定这是不是问题,但这是一个很好的第一步。

第二 - 你的间距在许多地方是不正确的,这可能导致涉及不匹配的parens的细微错误,这可能导致循环不按预期的方式运行。在最后一行中,]]]]应为]])],因此for不会被关闭。作为其他示例,您在[:div行之后缩进POST,不应缩进,并且您对所有缩进使用一个空格,除了嵌套向量之外,它应该是两个。