首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用go块构造clojure代码

用go块构造clojure代码
EN

Stack Overflow用户
提问于 2016-03-21 18:01:12
回答 1查看 253关注 0票数 0

我正在使用喷气机作为异步环适配器。Jet还附带了异步http客户机,它返回一个通道,其值的:body也是一个通道。

另外,异步服务器路由处理程序可以返回一个映射,该映射的:body密钥可以包含一个通道。当此通道关闭时,响应将返回给客户端。

我编写以下go代码:

代码语言:javascript
复制
 (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块吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 22:32:45

您所拥有的与我在生产中的等效代码非常相似。这是非常惯用的,所以我认为您的代码结构是正确的。

core.async停车操作不能跨越函数边界的事实源于这样一个事实:它是作为宏编写的,需要同时处理整个代码块(或者至少在它可用的时候)。这会使所有的core.async代码都出现在您所使用的模式中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36138432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档