假设我需要小部件数据和小部件数据。我需要通过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-part
和get-widget-then-widget-parts
,并成功获取该数据并检索部件数据。我的问题是它不是很容易组合。我需要创建另一个处理程序。与此同时,我不能(dispatch [:foo/get-widget])
将结果提供给(dispatch [:foo/get-widget-part])
(据我所知)。
答案 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
)。