2011-12-18 27 views
17

我是clojurescript的新手,希望通過純粹在clojurescript中實現一個先前編寫的應用程序來做更深入的探索,但是爲了實現ajax調用而不知所措。任何人都可以在網上給我一個例子,或給我提供一兩個代碼片段嗎?在clojurescript中實現ajax調用

回答

16

2016年1月22日更新

雖然它仍然有效,原來答案就是從那時候還普遍缺乏ClojureScript解決方案的超過1個貢獻者。絕對不要直接利用XhrIo,而應該考慮使用維護良好,功能豐富的解決方案,而不是像下面的Mikhail D所建議的那樣對其進行包裝:cljs-ajax


好了,因爲Clojurescript利用谷歌的關閉JavaScript庫,快速搜索的封閉文檔的產生xhrIo的適當方法產生AJAX調用:

Example using Closure's Asynchronous XMLHttpRequests with XhrIo

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content, 
    opt_headers, opt_timeoutInterval) 

一快速審查的Clojurescript源頭揭示了以下功能:

From src/cljs/clojure/browser/net.cljs in clojure/clojurescript

(defn xhr-connection 
    "Returns an XhrIo connection" 
    [] 
    (goog.net.XhrIo.)) 

所以沿着這個線的東西應該有預期的結果:

(def xhr xhr-connection) 

(defn myCallback [replyValue] 
    ... Do Something with replyValue 
    ... for example: (someJsonFunc (.getResponseJson (.target replyValue)))) 

(defn ajax-json [url] 
    (.send xhr url myCallback)) 

對於JSONP,你可以做類似的使用goog.net.Jsonp東西。看到該鏈接的詳細信息:

JSONP Closure API

希望有人認爲這很有幫助!

+1

我有點困惑:爲什麼'(XHR。發送URL myCallBack函數)'工作?據我可以告訴'xhr-connection'是一個返回一個新的'goog.net.XhrIo'的函數,那麼爲什麼'.send'在它上面工作呢? – Andrew 2012-04-14 15:47:14

+2

goog.net.XhrIo上的尾部點。使其相當於'new goog.net.XhrIo()' – 2013-05-31 21:17:01

6

我這樣做的方式稍有不同。我不知道爲什麼馬克在他的回答中建議的方式對我沒有用。希望這也是有用的。

我直接使用goog.net.XhrIo,而不是xhr-connection包裝。

(defn callback [reply] 
    (let [v (js->clj (.getResponseJson (.-target reply)))] ;v is a Clojure data structure 
     (your-function-here v))) 

(.send goog.net.XhrIo url callback) 

,我可以看到的主要區別是,我用.-target獲得JSON對象的屬性,而不是調用target

值得注意的是,已經從JSON對象創建的v中的地圖以字符串而不是關鍵字爲關鍵字。

13

的另一種可行的選擇可能是https://github.com/JulianBirch/cljs-ajax

,因爲它是專爲ClojureScript,語法看起來更清晰,更簡單。它還支持很多開箱即用的功能(例如:transitednjson格式)。

從README一些例子:

(ns foo 
    (:require [ajax.core :refer [GET POST]])) 

... 

(GET "/hello" {:handler handler 
       :error-handler error-handler}) 

(POST "/send-message" 
    {:params {:message "Hello World" 
       :user "Bob"} 
    :handler handler 
    :error-handler error-handler})