Реализация вызова ajax в clojurescript - PullRequest
17 голосов
/ 19 декабря 2011

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

Ответы [ 3 ]

16 голосов
/ 20 декабря 2011

Обновление от 22 января 2016 г.

Хотя это все еще работает, первоначальный ответ пришел из того времени, когда было общее отсутствие решений ClojureScript с более чем одним участником.Вместо того, чтобы напрямую использовать XhrIo, определенно рассмотрите возможность использования хорошо поддерживаемого, многофункционального решения, которое вместо этого обернет его, например, cljs-ajax , как предложено Михаилом D ниже!


ХорошоТак, учитывая, что Clojurescript использует библиотеку Google Closure JavaScript, быстрый поиск в документации Closure дал xhrIo в качестве правильного метода для генерации вызовов AJAX:

Пример использования асинхронного XMLHttpRequests Closure с 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.Для получения подробной информации см. Ссылку:

API закрытия JSONP

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

13 голосов
/ 01 сентября 2014

Другим жизнеспособным вариантом может быть 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})
6 голосов
/ 14 апреля 2012

То, как я это сделал, немного отличается. Я не знаю, почему то, что предложил Марк в своем ответе, не сработало для меня. Надеюсь, это также полезно.

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

...