2011-12-18 7 views
17

私はclojurescriptには新しく、以前に書かれたアプリケーションを純粋にclojurescriptで実装することで深いダイビングをしたいと思っていますが、ajax呼び出しを実装することに関しては紛失しています。誰かが私にオンラインの例を教えたり、コードスニペットか2つを私に教えてもらえますか?clojurescriptでajax呼び出しを実装する

答えて

16

2016年1月22日更新

それはまだ動作しますが、オリジナルの答えは、1つの以上の貢献者とClojureScriptソリューションの一般的な不足があった時からです。 XhrIoを直接活用するのではなく、下記のMikhail Dが示唆するように、cljs-ajaxの代わりに、機能が充実した、機能豊富なソリューションを使用してください。


わかりましたので、Clojurescriptは、Googleの閉鎖JavaScriptライブラリを活用することを考えると、閉鎖ドキュメントのクイック検索は、AJAXを生成するための適切な方法としてxhrIoをもたらしたコール:

Example using Closure's Asynchronous XMLHttpRequests with XhrIo

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

A 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

私は少し混乱している:なぜ '(.send XHRのURLのmyCallbackは)'動作しますか?私が 'xhr-connection'と言うことができるのは、新しい' goog.net.XhrIo'を返す関数だから、なぜ '.send'がそれに作用するのでしょうか? – Andrew

+2

最後のドットはgoog.net.XhrIoです。これは 'new goog.net.XhrIo()'と同等です –

6

私のやり方は少し異なります。私はなぜマークが彼の答えで示唆した方法が私のために働かなかったのかわからない。うまくいけば、これも便利です。

xhr-connectionラッパーではなく、goog.net.XhrIoを直接使用しました。

(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のマップは、キーワードではなく文字列でキーインされることに注意してください。構文が明確かつ単純に見えますが、ClojureScriptのために設計されていますので

13

アン別の実行可能な選択肢はhttps://github.com/JulianBirch/cljs-ajax

である可能性があります。また、多くの機能(例えば、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})