2017-01-24 1 views
2

C'est ce que j'utilise pour effectuer un appel distant à l'aide de la bibliothèque clj-http.Comment utiliser un atome qui a le résultat d'une requête http dans le réactif

(defn make-remote-call [endpoint] 
    (go (let [response (<! (http/get endpoint 
         {:with-credentials? false}))]))) 
    (reset! app-state response) 
    ;(js/console.log (print response))))) 

L'impression ci-dessus pour la console fonctionne bien

(defn call [] 
    (let [x (r/atom (make-remote-call site))] 
    (js/console.log x) 

cette recrache #object[cljs.core.async.impl.channels.ManyToManyChannel] dans la console.

Que puis-je faire pour renvoyer la réponse dans la fonction make-remote-call. J'ai utilisé la réponse pour définir la valeur d'un atome. Essayer de référencer des valeurs à l'intérieur de l'atome se traduit par des erreurs comme "Uncaught Error: [object Object] is not ISeqable" et No protocol method IDeref.-deref defined for type null:

Une idée de ce que je pourrais faire de mal?

S'il vous plaît laissez-moi savoir si je dois fournir toute information supplémentaire

Répondre

0

make-remote-call renvoie un canal. Essayez d'interroger cette chaîne pour voir ce qu'elle contient.

Cette question devrait aider:

Why do core.async go blocks return a channel?

Je pense que vous le savez déjà, mais vous devez dé référence un atome à savoir obtenir ce qui est à l'intérieur d'un atome, en utilisant @. Infominalement, la valeur que vous voulez est enveloppée dans deux conteneurs, vous devez donc avoir ce qu'il y a dans l'atome, puis ce qu'il y a dans le canal.