12

假设我有一个组件需要在渲染之前从服务器请求一些数据。

我现在拥有的类似于cljs-ajax图书馆:

(def data (r/atom nil)) 

(defn component [id]
  (r/create-class {:reagent-render simple-div
                   :component-did-mount (partial get-data id)}))

(defn get-data [id]
  (GET (str "/api/" id)
     {:handler init}))

(defn init [response]
  (let [data1 (:body response)
        data2 (compute data1)
        data3 (compute2 data2)]
    (reset! data (compute3 data1))
    (.setup @data data1)
    (.setup2 @data data2)
    (.setup3 @data data3))

setup函数是一些有副作用的国外JS库函数 。

这行得通,但我觉得这不是进行回调的正确方法。更不用说我是否需要GET基于我获得的第一个数据的其他数据,然后基于此的其他数据,这将是一个非常讨厌的回调链。

在试剂/clojurescript 中执行这种 ajax 请求是否有更好、更干净的方法?

4

1 回答 1

13

最常见的请求方式是 cljs-http。添加[cljs-http "0.1.39"]到依赖project.clj项并在终端中重新启动 figwheel 进程以获取新的依赖项。

(ns my.app     
  (:require
    [cljs.core.async :refer [<!]] [cljs-http.client :as http])
  (:require-macros [cljs.core.async.macros :refer [go]])

(go (let [response (<! (http/get "data.edn"))]
  (prn (:status response))
  (prn (:body response))))

Cljs-http 是管理 HTTP 请求的好方法。它使用 core.async 通道来传递结果。现在,您需要关注的是 http/get 和 http/post 调用应该发生在 go 表单中,结果是一个可以读取其结果的通道

依赖的 http 获取可以在一个看起来像顺序代码但异步发生的单个 go 块中以合理的方式链接在一起。

于 2016-06-12T03:10:29.460 回答