重新构建依赖于来自另一个http event-fx的数据的http event-fx

时间:2017-07-17 17:49:26

标签: ajax clojure clojurescript reagent re-frame

假设我需要小部件数据和小部件数据。我需要通过http请求检索小部件数据以获取其部件号。我使用那些parts-numbers来发出更多的http请求来获取零件数据。

使用"Nasa's Space pen Myth",它看起来像:

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

如何初始化我的页面的零件数据?我可以提出的最直接的方法是通过对窗口小部件执行http请求来编写另一个处理程序get-widget来包装get-widget-partget-widget-then-widget-parts,并成功获取该数据并检索部件数据。我的问题是它不是很容易组合。我需要创建另一个处理程序。与此同时,我不能(dispatch [:foo/get-widget])将结果提供给(dispatch [:foo/get-widget-part])(据我所知)。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您的目标是在get-widget-part返回带有部分ID的窗口小部件数据后创建多个get-widget请求。您可以编写一个查找ID的事件处理程序,并调度多个:foo/get-widget-part事件。

(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)为延迟和急切提取创建单独的事件(例如,{{1 }和:foo/get-widget)。我更喜欢后一个选项B,因为它更容易构建,例如,当添加专用API端点以获取具有部件的小部件时。

您可以撰写从事件处理程序返回的效果图的创建。在上面的示例中,延迟提取操作只会创建:foo/get-widget-with-parts效果(例如,:db),而渴望版本将由mk-db-widget-data更新和{{1}组成}事件(例如,:db)。