我使用jet作爲異步環形適配器。 Jet還附帶異步HTTP客戶端,它返回一個通道,其值爲:body
也是一個通道。使用go模塊構造clojure代碼
另外,異步服務器路由處理程序可以返回一個映射,其中的: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
塊中。 現在我用go
塊的頻道route-function
。這看起來是單一的嗎?我擔心不會將api-call-1-response-parse
甚至:body
作爲頻道提供給route-function
。
什麼是正確的方式來構造go
塊代碼和功能? 我是否應該在功能api-call-1/2
中關心額外的go
塊?