我一直试图修复此错误一段时间,但它让我望而却步。这个问题与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 %)}))
感谢大家的耐心等待。
干杯, 马特
答案 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
,不应缩进,并且您对所有缩进使用一个空格,除了嵌套向量之外,它应该是两个。