私は非同期リングアダプタに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
にありますか?