在clojurescript中实现ajax调用

Mar*_*arc 17 ajax jsonp clojurescript

我是clojurescript的新手,并希望通过实现一个纯粹在clojurescript中的先前编写的应用程序来进行更深入的研究,但是在实现ajax调用时却不知所措.任何人都可以在网上给我一个例子,或者给我一个或两个代码片段吗?

Mar*_*arc 16

2016年1月22日更新

虽然它仍然有效,但最初的答案是从普遍缺乏ClojureScript解决方案的时候开始,这个解决方案的贡献超过1.而不是直接利用XhrIo,绝对考虑使用维护良好,功能丰富的解决方案,将其包装成cljs-ajax,如下面的Mikhail D所示!


好吧,因为Clojurescript利用了Google的Closure JavaScript库,快速搜索Closure文档产生了xhrIo作为生成AJAX调用的正确方法:

使用Closure的异步XMLHttpRequests和XhrIo的示例

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content,
     opt_headers, opt_timeoutInterval)
Run Code Online (Sandbox Code Playgroud)

对Clojurescript源的快速回顾揭示了以下功能:

来自clojure/clojurescript中的src/cljs/clojure/browser/net.cljs

(defn xhr-connection
  "Returns an XhrIo connection"
  []
  (goog.net.XhrIo.))
Run Code Online (Sandbox Code Playgroud)

因此,根据这一点,应该有预期的结果:

(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))
Run Code Online (Sandbox Code Playgroud)

对于JSONP,您可以使用goog.net.Jsonp执行类似的操作.请参阅链接了解详情:

JSONP Closure API

希望有人觉得这很有帮助!

  • goog.net.XhrIo上的尾随点.使它等同于`new goog.net.XhrIo()` (2认同)

Mik*_*Mik 13

另一个可行的选择可以是https://github.com/JulianBirch/cljs-ajax

由于它是为ClojureScript设计的,因此语法看起来更清晰,更简单.它还支持很多功能开箱即用(例如:transit,ednjson格式).

自述文件中的一些示例:

(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})
Run Code Online (Sandbox Code Playgroud)


And*_*rew 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)
Run Code Online (Sandbox Code Playgroud)

我可以看到的主要区别是我曾经习惯于.-target获取JSON对象的属性,而不是调用target.

值得注意的是,v从JSON对象创建的地图是由字符串而不是关键字键控的.