2 回答

TA貢獻1943條經驗 獲得超7個贊
我認為你也可以調度一個getRawDataSuccess動作(執行 1 個 api 調用)
getRawData$ = createEffect(() =>
this.actions$.pipe(
ofType(ESchedulesActions.getRawData),
mergeMap(() =>
this.apiCallsService.getRawData().pipe(
map(data => ({ type: ESchedulesActions.GetRawDataSuccess, payload: data })),
catchError(err => ({ type: ESchedulesActions.GetRawDataError, payload: err }))
)
)
)
);
然后為每個治療創造一個效果,傾聽getRawDataSuccess行動:
getSchedulesByDate$ = createEffect(() =>
this.actions$.pipe(
ofType(ESchedulesActions.getRawDataSuccess),
map((action) => {
return {
type: ESchedulesActions.GetSchedulesByDateSuccess,
payload: action.payload.schedulesByDate,
}
})
)
);
getDirectionsByDate$ = createEffect(() =>
this.actions$.pipe(
ofType(ESchedulesActions.getRawDataSuccess),
map((action) => {
return {
type: ESchedulesActions.GetDirectionsByDateSuccess,
payload: action.payload.directionsByDate,
}
})
)
);
這將是更清潔的 IMO,理論上也將并行運行。

TA貢獻1744條經驗 獲得超4個贊
僅使用一種效果從 API 獲取原始數據并將其放入您的商店,然后創建兩個不同的選擇器來應用您的 groupByDirections 和 groupByDate 邏輯。
或者提取 groupByDirections 和 groupByDate 邏輯來實現。在你的效果中制作一個管道,應用兩種邏輯并以相同的效果分派兩個動作
更新:
如果你想執行兩個動作試試這個:
loadSchedulings$ = createEffect(() =>
this.actions$.pipe(
ofType(ESchedulesActions.getRawData),
mergeMap(action => this.apiCallsService.getRawData()),
map(rawApiData => {
const groupByDate = {}; // do your logic with rawApiData
const groupByDirections = {}; // do your logic with rawApiData
return { groupByDate, groupByDirections };
}),
mergeMap(groupedData => [
{
type: ESchedulesActions.GetDirectionsByDateSuccess,
payload: groupedData.groupByDirections,
},
{
type: ESchedulesActions.GetSchedulesByDateSuccess,
payload: groupedData.groupByDate,
},
]),
),
);
添加回答
舉報