2011-12-18 18 views
17

Soy nuevo en clojurescript y me gustaría hacer una inmersión más profunda mediante la implementación de una aplicación escrita previamente puramente en clojurescript, pero estoy en una pérdida con respecto a implementar una llamada ajax. ¿Puede alguien señalarme un ejemplo en línea o proporcionarme un fragmento de código o dos?Implementación de una llamada ajax en clojurescript

Respuesta

16

22 de de enero de, el año 2016 la actualización

A pesar de que todavía funciona, la respuesta original es de una época en la que había una falta general de soluciones ClojureScript con más de 1 colaborador. En lugar de aprovechar XhrIo directamente, definitivamente considere usar una solución bien mantenida y rica en características que la envuelva en su lugar como cljs-ajax, como lo sugiere Mikhail D a continuación.


bien, así que dado que Clojurescript aprovecha la biblioteca Cierre de JavaScript de Google, una búsqueda rápida de la documentación de cierre cedió xhrIo como el método adecuado para la generación de llamadas AJAX:

Example using Closure's Asynchronous XMLHttpRequests with XhrIo

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

Un una revisión rápida de la fuente Clojurescript reveló la siguiente función:

From src/cljs/clojure/browser/net.cljs in clojure/clojurescript

(defn xhr-connection 
    "Returns an XhrIo connection" 
    [] 
    (goog.net.XhrIo.)) 

Así que algo a lo largo de las líneas de este debe tener los resultados esperados:

(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)) 

Para JSONP, se puede hacer algo similar usando el goog.net.Jsonp. Vea el enlace para más detalles:

JSONP Closure API

la esperanza que alguien encuentre útil esta información!

+1

estoy un poco confundido: ¿por qué '(.send MyCallback xhr url)' funciona? Por lo que puedo decir 'xhr-connection' es una función que devuelve un nuevo' goog.net.XhrIo', ¿por qué '.send' funciona en él? – Andrew

+2

el punto final en goog.net.XhrIo. lo hace equivalente a 'new goog.net.XhrIo()' –

6

La forma en que lo hice es ligeramente diferente. No sé por qué la forma en que Marc sugirió en su respuesta no funcionó para mí. Espero que esto también sea útil.

He usado goog.net.XhrIo directamente, en lugar de la envoltura 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) 

La principal diferencia que puedo ver es que he utilizado .-target para obtener la propiedad del objeto JSON, en lugar de llamar target.

Vale la pena señalar que los mapas en v que se han creado a partir de objetos JSON están codificados por cadenas, no por palabras clave.

13

Una otra opción viable podría ser https://github.com/JulianBirch/cljs-ajax

Ya que está diseñado para ClojureScript, la sintaxis es más clara y sencilla. También admite muchas funciones listas para usar (por ejemplo, los formatos transit, edn y json).

Algunos ejemplos de una 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})