17

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

4

3 回答 3

16

2016 年 1 月 22 日更新

尽管它仍然有效,但最初的答案是在普遍缺乏超过 1 个贡献者的 ClojureScript 解决方案的时候。与其直接利用 XhrIo,不如考虑使用维护良好、功能丰富的解决方案,而不是像cljs-ajax那样包装它,如下面的 Mikhail D 建议的那样!


好的,鉴于 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 闭包 API

希望有人觉得这有帮助!

于 2011-12-20T07:47:18.110 回答
14

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

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

自述文件中的一些示例:

(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})
于 2014-08-31T21:25:24.913 回答
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.

值得注意的是,v从 JSON 对象创建的映射是由字符串而不是关键字作为键的。

于 2012-04-14T16:41:39.573 回答