Asynchronous 用go块构造clojure代码
我正在使用异步环适配器。 Jet还附带了异步http客户端,它返回一个通道,其值的Asynchronous 用go块构造clojure代码,asynchronous,clojure,core.async,Asynchronous,Clojure,Core.async,我正在使用异步环适配器。 Jet还附带了异步http客户端,它返回一个通道,其值的:body也是一个通道 此外,异步服务器路由处理程序可以返回其:body键可以包含通道的映射。当此通道关闭时,响应将返回给客户端 我正在写下面的代码: (defn- api-call-1 [] (go (-> (jet-client/get "api-url-1") <! :body ;; jet http c
:body
也是一个通道
此外,异步服务器路由处理程序可以返回其:body
键可以包含通道的映射。当此通道关闭时,响应将返回给客户端
我正在写下面的代码:
(defn- api-call-1 []
(go (-> (jet-client/get "api-url-1")
<!
:body ;; jet http client :body is also a channel.
<!
api-call-1-response-parse)))
(defn- api-call-2 []
(go (-> (jet-client/get "api-url-2")
<!
:body
<!
api-call-2-response-parse)))
(defn route-function []
(let [response-chan (chan)]
(go
(let [api-call-1-chan (api-call-1) ;; using channel returned by go
api-call-2-chan (api-call-2)]
(-> {:api-1 (<! api-call-1-chan)
:api-2 (<! api-call-2-chan)}
encode-response
(>! response-chan)))
(close! response-chan))
;; for not blocking server thread, return channel in body
{:body response-chan :status 200}))
(defn-api-call-1[]
(go(->(jet客户端/get“api-url-1”)
(jet客户端/获取“api-url-2”)
{:api-1(!response chan)))
(关闭!回应)
;为了不阻塞服务器线程,在主体中返回通道
{:身体反应(陈:状态200}))
在我的路由功能中
,我无法阻塞
虽然这段代码工作正常,但在api-call-1中使用go
是否不好
我发现要在api-call-1
中使用,我需要将它放在go
块中。
现在,我在路由函数中使用了这个go
块的通道。这看起来很单调吗?我担心的是,不会将api-call-1-response-parse
甚至:body
作为路由函数的通道公开
构造go
块代码和函数的正确方法是什么?
我是否应该关心函数中额外的go
块api-call-1/2
?您的代码与我在生产中的代码非常相似。这是非常惯用的,因此我认为您的代码结构正确
core.async parking Operations不能跨越函数边界的事实源于这样一个事实,即它是作为宏编写的,需要一次处理整个代码块(或者至少在词汇可用的情况下)。这会使所有core.async代码以您使用的模式出现