2016-03-10 58 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