[英]how to do ajax request in clojurescript with reagent?
假設我有一個組件需要在渲染之前從服務器請求一些數據。
我現在擁有的是與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請求?
最常見的請求方式是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 gets可以在一個看似順序代碼的單個塊中以合理的方式鏈接在一起,但是異步發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.