2017-07-17 62 views
1

假設我需要構件數據和構件部件數據。我需要通過http請求獲取小部件數據以獲取其零部件編號。我使用這些部分數字來製作更多的http請求來獲取零件數據。取決於來自另一個http事件的數據的重新構建http事件-fx

使用https://github.com/Day8/re-frame-http-fx,它會看起來像:

(reg-event-fx 
:foo/get-widget 
(fn [{:keys [db]} [_]] 
    {:http-xhrio {:method :get 
       :uri "foobar.com/widget" 
       :format (ajax/transit-request-format) 
       :response-format (ajax/json-response-format) 
       :on-success [:foo/load-widget] 
       :on-failure [:foo/set-error]}})) 

(reg-event-fx 
:foo/get-widget-part 
(fn [{:keys [db]} [_ part-number]] 
    {:http-xhrio {:method :get 
       :uri (str "foobar.com/part/" part-number) 
       :format (ajax/transit-request-format) 
       :response-format (ajax/json-response-format) 
       :on-success [:foo/load-part] 
       :on-failure [:foo/set-error]}})) 

我將如何初始化我的部分數據爲我的網頁?我能想到的最直接的方法是通過編寫另一個處理程序get-widget-then-widget-parts來對get-widgetget-widget-part進行包裝,方法是對小部件執行http請求併成功獲取該數據並檢索零件數據。我的問題是它不是很合成。我需要創建另一個處理程序。同時,我不能只(dispatch [:foo/get-widget])並將結果輸入到(dispatch [:foo/get-widget-part])(據我所知)。

回答

0

如果我理解正確,您的目標是在get-widget返回具有部分ID的小部件數據後創建多個get-widget-part請求。您可以編寫查找ID的事件處理程序,並分派多個事件。

(reg-event-fx 
    :foo/load-widget ;Your :on-success event 
    (fn [{:keys [db]} [_ widget-data]] 
     (let [ids   (get-part-ids widget-data) 
      missing-ids (remove #(get-part-with-id db %) ids)] ;Load only missing parts 
     {:db   (set-widget-data db widget-data) 
     :dispatch-n (map (fn [id] [:foo/get-widget-part id]) missing-ids)}))) 

您可能不希望每次都「熱切」地獲取零件。因此,您可以A)提供單獨的參數(例如,:fetch-eager)並根據條件合併:dispatch-n,或者B)爲懶惰和渴望獲取(例如,:foo/get-widget:foo/get-widget-with-parts)創建單獨的事件。我更喜歡後面的選項B,因爲它更容易構建,例如,當添加專用的API端點以獲取部件的部件時。

您可以撰寫從事件處理程序返回的效果圖的創建。在上面的例子中,延遲獲取動作只會產生一個:db效果(例如mk-db-widget-data),而渴望版本將由:db更新和:get-widget-part事件(例如,mk-dispatch-get-widget-parts)組成。

相關問題