2016-03-21 46 views
0

我使用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塊?

回答

0

你看起來很像我在生產中的等效代碼。這是相當習慣的,所以我認爲你的代碼結構正確。

core.async停車操作不能跨越功能邊界的事實源於它被寫爲宏並需要立即處理整個代碼塊(或至少在詞彙可用時)。這往往會使所有core.async代碼出現在您使用的模式中。