NGRX store.dispatch () синхронизирует / асинхронные вызовы в цикле - PullRequest
0 голосов
/ 12 июня 2018

Я реализовал магазин 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",

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...