usernamenotfound
usernamenotfound

Reputation: 1580

How to use an atom which has the result of a http-request in reagent

This is what I'm using to make a remote call using the clj-http library.

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

The above print to console works fine

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

this spits out #object[cljs.core.async.impl.channels.ManyToManyChannel] in the console.

What can I do to return the response in the make-remote-call function.

I used the response to set an atom's value. Trying to reference values inside the atom results in errors like "Uncaught Error: [object Object] is not ISeqable" and No protocol method IDeref.-deref defined for type null:

Any idea what I might be doing wrong?

Please let me know if I need to provide any additional info

Upvotes: 2

Views: 593

Answers (1)

Chris Murphy
Chris Murphy

Reputation: 6509

make-remote-call is returning a channel. Try interrogating this channel to see what's inside it.

This question should help:

Why do core.async go blocks return a channel?

I think you know this already, but you need to de-reference an atom i.e. get what is inside an atom, using @. Infomally speaking, the value you want is wrapped in two containers, so you need to get what's inside the atom, then what's inside the channel.

Upvotes: 1

Related Questions