2016-03-21 4 views
0

私は非同期リングアダプタにjetを使用しています。 Jetには、値が:bodyもチャネルであるチャネルを返すasync http-clientが付属しています。goブロックでクロージャコードを構成する

また、非同期サーバールートハンドラは、:bodyキーにチャネルが含まれるマップを返すことができます。このチャネルが閉じられると、応答がクライアントに返されます。

私はgo次のコード書いている:私のroute-function

(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})) 

、私はブロックできません。

このコードは正常に動作しますが、api-call-1のgoが悪いですか?

私はを見つけました。それはgoブロックに入れる必要があります。 ここでは、このgoブロックのチャネルをroute-functionに使用しています。これは単調に見えますか?私はroute-functionへのチャネルとしてapi-call-1-response-parse、さらには:bodyを公開しないことを心配しています。

goブロックコードと機能を正しく構成する方法は何ですか? goブロックが、機能api-call-1/2にありますか?

答えて

0

あなたが持っているものは、私が生産している同等のコードとよく似ています。これはかなり慣れているので、コードが正しく構成されていると思います。

core.asyncの駐車場が関数の境界を越えることができないという事実は、それがマクロとして書かれているため、コード全体を一度に処理する必要があります(または少なくともレキシカルで利用可能な間は)。これは、使用しているパターンですべてのcore.asyncコードが出力される傾向があります。

関連する問題