2017-07-17 38 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)组成。

相关问题