Asynchronous 用go块构造clojure代码

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

我正在使用异步环适配器。 Jet还附带了异步http客户端,它返回一个通道,其值的
: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代码以您使用的模式出现