2011-12-18 2 views
17

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

ответ

16

22 января 2016 обновление

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


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

Example using Closure's Asynchronous XMLHttpRequests with XhrIo

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content, 
    opt_headers, opt_timeoutInterval) 

быстрый обзор источника Clojurescript выявил следующие функции:

From src/cljs/clojure/browser/net.cljs in 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. Смотрите ссылку для подробностей:

JSONP Closure API

Надежда кто-то считает, что это полезно!

+1

Я немного запутался: почему '(XHR Пошлите URL myCallback)' работает? Насколько я могу судить, 'xhr-connection' - это функция, которая возвращает новый' goog.net.XhrIo', поэтому почему '.send' работает над этим? – Andrew

+2

конечная точка на goog.net.XhrIo. делает его эквивалентным 'new goog.net.XhrIo()' –

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

13

другой жизнеспособный вариант может быть 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}) 
Смежные вопросы