2016-09-21 66 views
1

我一直在尝试解决这个错误一段时间,但它没有回避。这个问题与for循环有关,因为当我将它移除时,对组件的调用被限制为一个,但是对它继续被调用。这导致我想消除的无限POST调用。简而言之,组件不断被渲染,而不仅仅是加载页面。ClojureScript试剂组件不断刷新,导致多次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

两件事情来处理,但鉴于出现的上下文:

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

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

这将产生以下的结构,这是你想要的(从上面的代码pprinted):

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

我不知道这是否是问题,但这是一个好的第一步。

第二 - 在许多地方你的间距不正确,这可能会导致包含不匹配参数的细微错误,这可能导致循环不能按照你期望的方式工作。例如,在最后一行中,]]]]应为]])],因此for未关闭。作为其他示例,您在POST行之后缩进[:div,当它不应缩进,并且所有缩进都使用一个空格时,除嵌套矢量外,它应为两个。

+0

间距主要是因为我很难用正确的缩进在Stackoverflow中输入它。我会尝试一下vec。 – phlie

+0

@phlie非常容易理解,但是如果您希望其他人能够读取您的代码,这很重要 - 我最大的疑问就是,您似乎没有关闭最后一行的'for'循环(剩下9个) parens在你的代码中,只有8个正确的parens)...不知道这是否是复制/粘贴错误,但... – Josh

+0

@phlie再次查看代码后,我意识到我犯了一个错误,在上面修改它。以前的结果是一个双嵌套向量,当你想要上面的扁平结构时,我想。请验证上面的输出具有您想要的结构,我认为它的确如此 - 如果是这样,那么上面的代码现在是正确的。 – Josh