如何处理 cljs-ajax 响应?

BWS*_*rns 2 ajax clojure clojurescript

我正在使用 cljs-ajax 从 clojurescript 前端向使用 JSON 响应的 API 发出请求,但似乎我需要对它做一些事情才能在 cljs 中使用它。

(defn all-pieces []
  (GET "/art/pieces" {:handler ajax-success-handler}))
Run Code Online (Sandbox Code Playgroud)

当我初始化我的应用程序状态时,我分配了密钥 :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)])])
Run Code Online (Sandbox Code Playgroud)

编辑重新普拉特利:

下面的代码现在导致的状态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)))
Run Code Online (Sandbox Code Playgroud)

Tim*_*ley 5

不要设置:all-peices为 的结果(all-pieces)。该函数ajax-success-handler应该:all-peices改为设置。的结果(all-pieces)是启动异步调用的结果,而不是响应。处理程序是响应到达时调用的对象。

(fn [pcs] swap! app-state assoc :all-pieces pcs)
Run Code Online (Sandbox Code Playgroud)

不做任何交换,作为交换!需要在括号中...它只是一个返回 pcs 的函数。考虑将其提升为命名函数,以便您可以单独测试它:

(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)
Run Code Online (Sandbox Code Playgroud)