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