2016-03-21 14 views
0

Asenkronize halka bağdaştırıcısı için jet kullanıyorum. Jet ayrıca, :body değeri de bir kanal olan bir kanalı döndüren async http-client ile birlikte gelir.Git blokları ile clojure kodu yapılandırma

Ayrıca, eşzamansız sunucu yol işleyicisi, :body anahtarı kanalı içerebilen bir haritayı döndürebilir. Bu kanal kapatıldığında, yanıt müşteriye iade edilir.

İzlediğim go kod yazıyorum: Benim route-function yılında

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

i engelleyemezsiniz.

Bu kod düzgün çalışıyor olsa da, api-call-1 içinde go kullanıyor musunuz?

api-call-1 numaralı telefondan <!'u kullanıyorum. Bunu go bloğuna koymam gerekiyor. Şimdi bu go bloğunun kanalını route-function numaralı telefondan kullanıyorum. Bu unidomatic görünüyor mu? api-call-1-response-parse veya hatta :body kanallarını route-function numaralı kanala maruz bırakmama konusunda endişeliyim.

Yapı go kodunun ve işlevlerinin yapılandırılmasının doğru yolu nedir? api-call-1/2 işlevlerindeki fazladan go blokları önemsemem gerekir mi?

cevap

0

Üretiminizde sahip olduğum eşdeğer kodlara çok benziyorsunuz. Bu oldukça deyimsel, bu yüzden kodunuzun doğru yapılandırıldığını düşünüyorum.

Core.async park karşıtlıklarının işlev sınırlarını aşamadığı gerçeği, bir makro olarak yazılmış olması ve kodun tamamını bir kerede (ya da en azından sözcüksel olarak kullanılabilir olsa da) işlemesi gerektiğinden kaynaklanıyor. Bu, tüm core.async kodlarını kullanmakta olduğunuz kalıpta gösterme eğilimindedir.