簡體   English   中英

如何用clojurescript用試劑做ajax請求?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM