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 get は、順次コードのように見えますが、非同期で発生する単一の go ブロックで賢明な方法で連鎖させることができます。

于 2016-06-12T03:10:29.460 に答える