在ClojureScript中实现ajax调用

17

我刚接触ClojureScript, 为了更深入地学习,我想用纯ClojureScript实现之前写过的应用程序。但是,在实现ajax调用方面我遇到了困难。有没有人可以给我提供一个在线示例或者提供一两个代码片段?

3个回答

16

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)

快速查看Clojurescript源代码后发现以下函数:

源自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))

对于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() - Justin Abrahms

14

另一个可行的选择是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})

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中的映射是由字符串而不是关键字键入的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接