2016-03-10 5 views
1

Я делаю запрос из интерфейса clojurescript с cljs-ajax в API, который отвечает JSON, но кажется, что мне нужно что-то сделать, прежде чем я смогу использовать его в cljs.Как обрабатывать ответы cljs-ajax?

(defn all-pieces [] 
    (GET "/art/pieces" {:handler ajax-success-handler})) 

Когда я инициализировать мое приложение-состояние я задаю ключ :all-pieces (all-pieces)

Когда я перебрать :all-pieces в компоненте я получаю ошибку Uncaught Error: [object Object] is not ISeqable.

(defn pieces-component [] 
    [:ul (for [piece (:all-pieces @app-state)] 
     [:li (art-piece piece)])]) 

Edited повторно Pratley:

ниже код в настоящее время приводит к состоянию all-pieces будучи {}, вижу ничего плохого?

;; ------------------------- 
;; Remote Data 

(defn all-pieces [handler] 
    (GET "/art/pieces" {:handler handler})) 

;; ------------------------- 
;; State Management 

(def app-state (atom 
    {:doc {} 
    :saved? false 
    :page-state {} 
    :all-pieces {}})) 


(defn set-pieces-fresh [] 
    (all-pieces (fn [pcs] swap! app-state assoc :all-pieces pcs))) 
+1

Попробуйте сделать (js/console.log (: all-pieces @ app-state)) ... есть вероятность, когда вы назначаете результат, вы назначаете объект ответа вместо фактических данных? –

+0

Я получаю '#object [Object [object Object]]'. Он застрял как объект JS, когда он должен быть картой cljs? – BWStearns

+0

При использовании js/console.log он должен отображаться в виде просматриваемого объекта в консоли, что обычно дает некоторые подсказки о том, что в нем. –

ответ

2

Не устанавливайте :all-peices в результате (all-pieces). Функция ajax-success-handler должна установить вместо :all-peices. Результат (all-pieces) является результатом запуска асинхронного вызова, а не ответа. Обработчик - это то, что вызывается, когда приходит ответ.

(fn [pcs] swap! app-state assoc :all-pieces pcs) 

Не заменяет, как своп! должно быть в parens ... это просто функция, которая возвращает шт. Подумайте о том, чтобы продвинуть его к названной функции, чтобы вы могли ее протестировать отдельно:

(def app-state 
    (atom {:all-pieces {}})) 

(defn pieces-handler [pcs] 
    (swap! app-state assoc :all-pieces pcs)) 

(defn fetch-pieces [] 
    (GET "/art/pieces" {:handler pieces-handler})) 

(fetch-pieces) 
+0

Так что похоже, что он должен работать, и я думаю, что это было сделано с точки зрения фиксации назначения атома. Благодаря тонну! – BWStearns

Смежные вопросы