2016-03-10 91 views
1

我正在用cljs-ajax從clojurescript前端發出一個請求到一個用JSON響應的API,但似乎我需要在它可以在cljs中使用它之前做一些事情。如何處理cljs-ajax響應?

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

當我初始化我的應用程序狀態我分配的關鍵:all-pieces (all-pieces)

當我走在一個組件出現錯誤Uncaught Error: [object Object] is not ISeqable遍歷:all-pieces

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

編輯整理普拉特利:

現在下面的代碼導致的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(:全片@應用程序狀態))......當你分配機會結果,你是在分配響應對象而不是實際的數據? –

+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