我是clojurescript的新手,并希望通过纯粹在clojurescript中实现以前编写的应用程序来进行更深入的研究,但是在实现ajax调用时却不知所措。任何人都可以在网上给我一个例子,或者为我提供一两个代码片段吗?
答案 0 :(得分:16)
2016年1月22日更新
尽管它仍然有效,但最初的答案是从普遍缺乏ClojureScript解决方案的时候开始,这个解决方案的贡献率超过1。而不是直接利用XhrIo,绝对考虑使用维护良好,功能丰富的解决方案,将其包装成cljs-ajax,如下面的Mikhail D所建议的那样!
好的,所以考虑到Clojurescript利用了Google的Closure JavaScript库,快速搜索Closure文档会产生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执行类似操作。有关详细信息,请参阅链接:
希望有人觉得这很有用!
答案 1 :(得分:13)
另一个可行的选择可能是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})
答案 2 :(得分:6)
我这样做的方式略有不同。我不知道为什么Marc在他的回答中建议的方式对我不起作用。希望这也很有用。
我直接使用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
中从JSON对象创建的地图是由字符串而非关键字键入的。