我刚接触ClojureScript, 为了更深入地学习,我想用纯ClojureScript实现之前写过的应用程序。但是,在实现ajax调用方面我遇到了困难。有没有人可以给我提供一个在线示例或者提供一两个代码片段?
我刚接触ClojureScript, 为了更深入地学习,我想用纯ClojureScript实现之前写过的应用程序。但是,在实现ajax调用方面我遇到了困难。有没有人可以给我提供一个在线示例或者提供一两个代码片段?
2016年1月22日更新
虽然原始答案仍然有效,但当时缺乏具有多个贡献者的ClojureScript解决方案。建议不要直接使用XhrIo,而是考虑使用像cljs-ajax这样的维护良好、功能丰富的包装器。
既然Clojurescript利用了Google的Closure JavaScript库,那么在Closure文档中搜索xhrIo就可以找到生成AJAX调用的正确方法:
使用Closure的异步XMLHttpRequest和XhrIo示例
goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content,
opt_headers, opt_timeoutInterval)
源自clojure/clojurescript中的src/cljs/clojure/browser/net.cljs
(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))
另一个可行的选择是https://github.com/JulianBirch/cljs-ajax
由于它是为ClojureScript设计的,所以语法看起来更清晰、更简单。它还支持许多开箱即用的功能(例如:transit
、edn
和json
格式)。
以下是一些自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})
我的做法略有不同。我不知道马克在他的回答中建议的方法为什么对我不起作用。希望这也有用。
我直接使用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
。v
中的映射是由字符串而不是关键字键入的。
(.send xhr url myCallback)
能够工作?据我所知,xhr-connection
是一个返回新的goog.net.XhrIo
的函数,那么为什么.send
可以在其上工作呢? - Andrewnew goog.net.XhrIo()
。 - Justin Abrahms