效果如下:我需要在两个地方使用具有不同有效载荷的相同服务来获取数据。即使我在第一个组件中使用它后取消订阅,当第二个组件的新值出现时,它总是被覆盖。
如果有效载荷不同,我需要使用单独的端点吗?或者有其他方法可以实现这一点。
@Effect()
getCampaignProductUserCountEffect$: Observable<Action> = this.actions$.pipe(
ofType<campaignAction.GetCampaignProductUserCountAction>(campaignAction.ActionTypes.GET_CAMPAIGN_PRODUCT_USER_COUNT),
withLatestFrom(this.store),
switchMap(([action, state]) => {
return this.campaignService.campaignProductUserCount(action.payload.data)
.pipe(
mergeMap((response: any) => {
return of(new campaignAction.GetCampaignProductUserCountSuccessAction(response));
}),
catchError(error =>
of(new globalActions.PopupNotificationAction({
actionType: campaignAction.ActionTypes.GET_CAMPAIGN_PRODUCT_USER_COUNT,
messageType: MessageType.Error,
message: error.error.message,
extraParameters: null,
error: error.error,
title: MESSAGE_CONSTANTS.CAMPAIGN_TITLE
}))
));
})
);
这是选择器:
const getCampaignProductUserCount = (state: CampaignState): boolean =>
state && state.productUserCount && state.productUserCount.data
export const selectCampaignProductUserCount: MemoizedSelector<object, any> = createSelector(
selectState,
getCampaignProductUserCount
);
这是我试图在我的一个组件中使用它的方式:
this.campaignStoreService.dispatchGetCampaignProductUserCount({ data: { productQuerys: { query: this.queries } }});
this.campaignStoreService.selectGetCampaignProductUserCount().subscribe(data => {
if(data) {
this.getUserCountCallback(data);
this.totalUserCount = data.userCount.userCount;
this.totalReach = data.userCount.user_projection;
}
});
在另一个组件中,我需要使用相同的东西,但具有不同的有效负载。
在这个组件中,我发送了一组查询来获取结果,在另一个地方,我需要计算每个查询的结果。
服务campaignProductUserCount(data) {
const url = this.apiConfig.getApiUrl() + API_PATH.CAMPAIGN_PRODUCT_USER_COUNT;
return this.post(url, data);
}
最初,当我们只需要一次计数时,我们在回调中获取数字。下面是效果(older):
@Effect()
getCampaignProductUserCountEffect$: Observable<Action> = this.actions$.pipe(
ofType<campaignAction.GetCampaignProductUserCountAction>(campaignAction.ActionTypes.GET_CAMPAIGN_PRODUCT_USER_COUNT),
withLatestFrom(this.store),
switchMap(([action, state]) => {
return this.campaignService.campaignProductUserCount(action.payload.data)
.pipe(
mergeMap((response: any) => {
action.payload.callback && action.payload.callback({ success: true, response });
return of(new campaignAction.GetCampaignProductUserCountSuccessAction(response));
}),
catchError(error => {
action.payload.callback && action.payload.callback({ success: false });
return of(new globalActions.PopupNotificationAction({
actionType: campaignAction.ActionTypes.GET_CAMPAIGN_PRODUCT_USER_COUNT,
messageType: MessageType.Error,
message: error.error.message,
extraParameters: null,
error: error.error,
title: MESSAGE_CONSTANTS.CAMPAIGN_TITLE
}))
}));
})
);
我是否可以使用相同的回调方法,或者我必须订阅?
我是新的rxjs,所以不知道是否有什么错误的选择正确的操作符或它的其他东西。
虽然您退订了,但您正在重新使用该动作和效果。您仍然调用相同的成功操作,即GetCampaignProductUserCountSuccessAction。因此,它将调用相同的reducer,并且您之前的数据将被覆盖。
首先,您不应该在多个作业中重用操作。每个动作都应该有一个特定的角色来完成[单一的职责]。效果也是一样。
您可以使用公共服务来获取资源。
另外,你在你的效果中使用了combineLatestFrom,但是我没有看到任何用法