Реализация вызова ajax в clojurescript


Я новичок в clojurescript и хотел бы сделать более глубокое погружение, реализовав ранее написанное приложение чисто в clojurescript, но я в недоумении относительно реализации вызова ajax. Может ли кто - нибудь указать мне на пример в интернете или предоставить мне один или два фрагмента кода?

3 17

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 в. Смотрите ссылку Дополнительные сведения:

JSONP Closure API

Надеюсь, кто-то найдет это полезным!

Другим жизнеспособным вариантом может быть 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, управляются строками, а не ключевыми словами.