Я работаю в Clojurescript и пытаюсь использовать core.async
, чтобы получить результат от собственной функции Javascript (я am в браузере) и условно интегрировать его в карту.
У меня есть функция для обертывания собственного вызова браузера (вдохновленный выступлением Тимоти Болдриджа о core.async, примерно 34 мин для интересующихся):
(defn geolocation []
(let [c (chan)
cb (fn [e] (put! c (js->clj e)))]
(if (exists? js/navigator.geolocation)
(.getCurrentPosition js/navigator.geolocation. cb cb)
(put! c {:error "Geolocation is not supported"}))
c))
Я могу использовать это так:
;; this works
(go (.log js/console "RES1 -" (<! (geolocation))))
;; this too (not sure how to print it though)
(go (println "RES2 - " (-> {}
(assoc :test (<! (geolocation))))))
;; this fails... why ?
(go (println "RES3 - " (-> {}
(#(when true
(assoc % :test (<! (geolocation))))))))
Последний пример завершается с ошибкой: Uncaught Error: <! used not in (go ...) block
, хотя я думал, что использую такую же структуру.
Что я делаю неправильно ?
Примечание . Я требую этого должным образом из директивы :require-macro
, как описано здесь.