что может быть лучшим способом обработки асинхронных каналов в кольце, в основном мне нужно получить ответ моего канала внутри моего обработчика, а затем обслужить ответ
(GET "/slow/:a" [a] (slow-request2 a))
;;this function do a slow operation simulating a slow request
(defn slow-response [a]
(let [ch (!/chan 1)]
(!/go (Thread/sleep 10000)
(print "running slow")
(!/>! ch (+ 1 a)))
ch))
;;based in the recommendation from http://www.reddit.com/r/Clojure/comments/2ka3na/how_do_you_organize_your_coreasync_code/cljbz2q
(defn slow-request [a]
(!/go-loop
[v (!/<! (slow-response a))]
(when v (do
(print "response v")
{:status 200 :body v}))))
(defn slow-request2 [a]
(!/go
(while true
{:status 200 :body (!/<! (slow-response a))})))
к сожалению, я получаю эту ошибку
java.lang.IllegalArgumentException в /slow/10
Нет реализации метода: :рендеринг протокола: #'compojure.response/Renderable найден для класса: clojure.core.async.impl.channels.ManyToManyChannel
кажется, что обработчик пытается ответить на весь блок go вместо моего тела запроса, я не могу найти решение для обработки ответа без побочных эффектов, кроме как использовать блокирующий ответ
что может быть лучшим подходом в этом случае?
примечание: я использую адаптер vertx/ring, поэтому http/kit сейчас не вариант, мне нужно найти способ обработки каналов в кольцевом ответе