2016-09-21 3 views
1

Я пытался исправить эту ошибку некоторое время, но это ускользает от меня. Проблема имеет какое-то отношение к циклу for, потому что когда я удаляю его, вызовы компонента ограничиваются одним, но с ним он продолжает вызываться. Это приводит к бесконечным вызовам POST, которые я хочу устранить. Короче говоря, компонент сохраняется, а не просто при загрузке страницы.Компонент ClojureScript Reagent постоянно обновляется во многих 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"]) 

EDIT

Я понял, что я об ошибке не имел никакого отношения к ленивому сексу. Извините за неясность, но ошибка заключалась в рендеринге объекта с 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 %)})) 

Спасибо всем за их терпение.

Приветствия, Matt

ответ

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 не закрывается, например. В качестве других примеров вы должны указать отступ [:div после строки POST, когда он не должен быть отступом, и вы используете одно пространство для всех отступов, и оно должно быть два, за исключением вложенных векторов.

+0

Интервал в основном потому, что я стараюсь вводить его в Stackoverflow с правильным отступом. Я попробую vec. – phlie

+0

@phlie очень понятно, но важно, если вы хотите, чтобы другие могли читать ваш код - мой самый большой вопрос в том, что вы, похоже, не закрываете цикл 'for' на последней строке (у вас осталось 9 parens в вашем коде и только 8 правых паренс) ... не знаю, была ли это ошибка копирования/вставки, но ... – Josh

+0

@phlie После того, как я снова посмотрел на код, я понял, что сделал ошибку и изменил его выше. Раньше результатом был двойной вложенный вектор, если вы хотите более плоскую структуру выше, я думаю. Пожалуйста, убедитесь, что выведенный выше результат имеет структуру, которую вы хотите, и я думаю, что это так - если это так, то код выше теперь корректен. – Josh