我正在使用喷气机作为异步环适配器。Jet还附带了异步http客户机,它返回一个通道,其值的:body也是一个通道。
另外,异步服务器路由处理程序可以返回一个映射,该映射的:body密钥可以包含一个通道。当此通道关闭时,响应将返回给客户端。
我编写以下go代码:
(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}))在我的route-function中,我无法阻止。
虽然这段代码运行良好,但是在api-call-1中使用go是不是不好呢?
我发现要在<!中使用api-call-1,我需要将它放在go块中。现在我在route-function中使用这个route-function块的频道。这看上去很不自然吗?我担心的是不公开api-call-1-response-parse甚至:body作为route-function的通道。
构造go块代码和函数的正确方法是什么?我应该关心函数api-call-1/2中额外的api-call-1/2块吗?
发布于 2016-03-21 22:32:45
您所拥有的与我在生产中的等效代码非常相似。这是非常惯用的,所以我认为您的代码结构是正确的。
core.async停车操作不能跨越函数边界的事实源于这样一个事实:它是作为宏编写的,需要同时处理整个代码块(或者至少在它可用的时候)。这会使所有的core.async代码都出现在您所使用的模式中。
https://stackoverflow.com/questions/36138432
复制相似问题