2

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

使用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-widgetget-widget-part编写另一个处理程序,方法get-widget-then-widget-parts是对小部件执行 http 请求,并在成功时获取该数据并检索部件数据。我的问题是它不是很可组合。我需要创建另一个处理程序。同时,我不能只是(dispatch [:foo/get-widget])将结果输入(dispatch [:foo/get-widget-part])(据我所知)。

4

1 回答 1

1

如果我理解正确,您的目标是在返回带有部件 ID 的小部件数据后创建多个get-widget-part请求。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)为惰性和急切的获取(例如,:foo/get-widget和)创建单独的事件:foo/get-widget-with-parts。我更喜欢后一个选项 B,因为它更容易构建,例如,当添加专用 API 端点以获取带有部件的小部件时。

您可以编写从事件处理程序返回的效果图的创建。在上面的示例中,惰性获取操作只会创建一个:db效果(例如,mk-db-widget-data),而急切版本将由:db更新和:get-widget-part事件(例如,mk-dispatch-get-widget-parts)组成。

于 2017-07-18T08:08:47.267 回答