2016-09-21 81 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