Я реализовал магазин Ngrx в уже работающем приложении, но у меня неожиданное поведение, с которым я хотел бы получить обратную связь.Чтобы быть более точным, это та часть, которая действительно сбивает меня с толку.
action.ts:
export class AddGeoReports implements Action {
readonly type = ADD_GEOREPORTS_MAP;
constructor( public payload: { key: string, data: reportPreviewObj[] }) { }
}
reducer.ts
export interface GeoReportsMap {
data: Map<string, reportPreviewObj[]>
}
const initialState: GeoReportsMap = {
data: new Map()
}
export function reducer(state = initialState, action: fromActions.GeoReportsMapAction): GeoReportsMap {
switch(action.type) {
case fromActions.ADD_GEOREPORTS_MAP: {
const newState = state.data;
newState.set(action.payload.key, action.payload.data)
console.log(newState);
return {...state, data: newState }
}
default: return state
}
};
service.ts
createGeoReportMapping(geoMappingKey: string , reportPreviewObj: reportPreviewObj){
let geoReport: reportPreviewObj[] = this.geoReportsMap.get(geoMappingKey);
if (!geoReport) {
...
} else {
...
}
this.store.dispatch<fromStore.GeoReportsMapAction>(new fromStore.AddGeoReports({key: geoMappingKey, data: geoReport}));
}
component.ts
subscribe(reportsObjects => {
if (reportsObjects.data) {
this.reportsObjects = reportsObjects.data;
this.reportsObjects.forEach((reportObject) => {
if (!Array.isArray(reportObject.data) && (reportObject.data.inspectionInfo.coordinates) && (reportObject.data.inspectionInfo.orderStatusShortname !== 'CLOSED')) {
let reportPreviewObj: reportPreviewObj = {
...
};
if (reportObject.data.documentationView) {
...
}
const geoMappingKey = `${parseFloat(reportObject.data.inspectionInfo.coordinates.lat.toFixed(7))}, ${parseFloat(reportObject.data.inspectionInfo.coordinates.lng.toFixed(7))}`
this.mapService.createGeoReportMapping(geoMappingKey, reportPreviewObj);
}
});
Теперь после выполнения в службе IМожно ожидать, что каждый раз, когда эта функция вызывается из компонента, будет происходить событие отправки, которое я смогу увидеть в console.log () редуктора, вместо этого я получаю, что функция вызывается 30 раз (еслиУ меня есть 30 отчетов), и только после этого он входит в редуктор и остается там в течение следующих 30 раундов, пока карта не будет заполнена.По сути, он, похоже, хранит / сохраняет каким-то образом диспетчерские вызовы в хранилище и выполняет их, как только функция завершена со всеми отчетами.Кроме того, он проходит через вызовы редуктора, как только поступает туда очень медленно, как если бы они все были каким-то образом асинхронными вызовами.
Любая помощь будет оценена!Спасибо!
Использование: "@ ngrx / store": "^ 5.2.0", "@ angular / core": "^ 5.2.0",