javascript - 在 React 中使用 RxJs 链接 Observable 的最佳方法
问题描述
在这种情况下,最好的办法是链接 Observables 并在SEARCH_QUERY_COMPLETE
所有订阅完成后调度操作?我注意到它forkJoin
已被弃用...
const launchSearchQuery = () => {
mainDispatch({
type: ActionTypes.LAUNCH_SEARCH_QUERY,
});
if (mainState.searchSection.searchQuery !== "") {
// get order details
orderDetailRepository.getOrderDetails(mainState.searchSection.searchQuery).subscribe((response) => {
searchResultCards.push(mapSearchResultCard(response, DashboardSectionTitles.ORDER_DETAILS));
});
// get customer details
customerDetailRepository.getCustomerDetails(mainState.searchSection.searchQuery).subscribe((response) => {
searchResultCards.push(mapSearchResultCard(response, DashboardSectionTitles.CUSTOMER_DETAILS));
});
// get equipment details
equipmentDetailRepository.getEquipmentDetails(mainState.searchSection.searchQuery).subscribe((response) => {
searchResultCards.push(mapSearchResultCard(response, DashboardSectionTitles.EQUIPMENT_DETAILS));
});
// get equipment return details
equipmentReturnDetailRepository
.getEquipmentReturnDetails(mainState.searchSection.searchQuery)
.subscribe((response) => {
searchResultCards.push(mapSearchResultCard(response, DashboardSectionTitles.EQUIPMENT_RETURN_DETAILS));
});
}
// !!! only execute this when all subscriptions are completed !!!
mainDispatch({
type: ActionTypes.SEARCH_QUERY_COMPLETE,
payload: searchResultCards,
});
};
这里是蓝图getOrderDetails
export interface IOrderDetailRepository {
getOrderDetails: (query: string) => Observable<IOrderDetail[]>;
}
解决方案
你可以forkJoin
这样使用 -
const launchSearchQuery = () => {
mainDispatch({
type: ActionTypes.LAUNCH_SEARCH_QUERY,
});
if (mainState.searchSection.searchQuery !== "") {
forkJoin([
// get order details
orderDetailRepository.getOrderDetails(mainState.searchSection.searchQuery),
// get customer details
customerDetailRepository.getCustomerDetails(mainState.searchSection.searchQuery),
// get equipment details
equipmentDetailRepository.getEquipmentDetails(mainState.searchSection.searchQuery),
// get equipment return details
equipmentReturnDetailRepository.getEquipmentReturnDetails(mainState.searchSection.searchQuery)
]).subscribe(([orderDetails, customerDetails, equipMentDetails, equimentReturnDetails]) => {
searchResultCards.push(mapSearchResultCard(orderDetails, DashboardSectionTitles.ORDER_DETAILS));
searchResultCards.push(mapSearchResultCard(customerDetails, DashboardSectionTitles.CUSTOMER_DETAILS));
searchResultCards.push(mapSearchResultCard(equipMentDetails, DashboardSectionTitles.EQUIPMENT_DETAILS));
searchResultCards.push(mapSearchResultCard(equimentReturnDetails, DashboardSectionTitles.EQUIPMENT_RETURN_DETAILS));
// !!! only execute this when all subscriptions are completed !!!
mainDispatch({
type: ActionTypes.SEARCH_QUERY_COMPLETE,
payload: searchResultCards,
});
});
}
};
推荐阅读
- python - 从图片中剪切颜色
- python-3.x - 在一张图中重叠条形图
- facebook-graph-api - 未归因于广告的服务器端 PageView 事件
- c# - 如何获取获取请求的所有参数名称(来自查询字符串)?
- adobe - Adobe AEM - 如何在运行时组合客户端库
- javascript - 删除所选文本中具有特定类的任何跨度
- android - 调试器没有在 livedata 观察者内的断点处中断?(附有 Gif)Android
- r - 如何在 R 中生成特定的设计矩阵?
- git - 将版本保存在 GitHub 中的某处
- javascript - 如何在不重复的情况下随机匹配同一个数组中的几个数据?