Я новичок в clojurescript и хотел бы сделать более глубокое погружение, выполнив ранее написанное приложение только в clojurescript, но я не понимаю, как реализовать вызов ajax. Может ли кто-нибудь указать мне пример онлайн или предоставить мне фрагмент кода или два?
Реализация вызова ajax в clojurescript
Ответ 1
22 января 2016 года обновление
Несмотря на то, что он по-прежнему работает, исходный ответ происходит от времени, когда общее отсутствие решений ClojureScript с более чем 1 вкладчиком. Вместо того, чтобы напрямую использовать XhrIo, определенно подумайте о том, чтобы использовать хорошо поддерживаемое многофункциональное решение, которое вместо этого обертывает его, а cljs-ajax, как это предложил Михаил D ниже!
Хорошо, поэтому, учитывая, что Clojurescript использует библиотеку JavaScript Google Closure, быстрый поиск документации Closure дал xhrIo как правильный метод для генерации вызовов AJAX:
Пример использования Closure Asynchronous XMLHttpRequests с XhrIo
goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content,
opt_headers, opt_timeoutInterval)
Краткий обзор источника Clojurescript показал следующую функцию:
Из src/cljs/ clojure/browser/net.cljs в 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. Подробнее см. Ссылку:
Надеюсь, что кто-то найдет это полезным!
Ответ 2
Другим жизнеспособным вариантом может быть 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})
Ответ 3
То, как я это делал, немного отличается. Я не знаю, почему Маркус, предложенный в его ответе, не работал у меня. Надеюсь, это также полезно.
Я использовал 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, имеют ключевое слово, а не ключевые слова.