Почему игнорируется повторный вызов всех epic-ов при возникновении ошибки (angular4)?
Действия происходят в одном и том же виджете/отчёте, если открываем виджит и происходит ошибка, то уже при открытии повторно этого же виджита - эти же самые epics-и перестают работать и игнорируются (соответственно в redux не создаются состояния для данного отчёта).
т.е. открываем на просмотр один и тот же виджит друг за другом (по одному разу). После первого открытия отчёта/виджита если ошибки не происходит, то 2-ой виджит тоже хорошо работает (т.е. те же самые epic-и хорошо отрабатывают и для второго виджита). Но вот если происходит ошибка (обрабатывается блоком catch()), то при открытии всех последующих этих же виджитов - epic-и будут игнорироваться. С чем связано такое поведение и что можете посоветовать? |
.
journal.epic.ts: ........................................................................ @Injectable() export class WorkingTimeJournalDetailEpics { /** * Инъектируем зависимости в конструкторе * @param service * @param actions */ constructor(private service: WorkingTimeJournalDetailService, private actions: WorkingTimeJournalDetailActions) { this.service.columnSetting = columnSettings; } /** * Создает корневого посредника путем комбинирования дочерних */ public createEpic() { return createEpicMiddleware(combineEpics( this.createAddReportEpic(), this.createLoadPageEpic(), this.createReceivePageEpic() )); } /** * Обработка действия добавления новго отчета */ private createAddReportEpic() { return (action$, store) => action$ .filter(a => { debugger; return a; }) .ofType(Actions.GROUPS_ADD, Actions.GROUPS_ADD_SELECTED) .filter(action => inArrayFilter(WIDGET_NAME, action.payload.additional.widgets)) .map(action => this.actions.addGroup(action.payload.id)); } /** * Обработка действия загрузка страницы */ private createLoadPageEpic() { return (action$, store) => action$ .ofType(WorkingTimeJournalDetailActions.LOAD_PAGE) .switchMap(action => { if (action.payload.userId) { const state = store.getState(); const report = state[WORKING_TIME_JOURNAL_DETAIL_REDUX_NODE][action.meta.reportId]; let sort = report.sort; const dateRange: DateRangeInterface = filters && filters.dateRange ? filters.dateRange : { from: moment().startOf('day').utcOffset(0, true), to: moment().endOf('day').utcOffset(0, true), }; const loadFilters = { user_id: action.payload.userId, date_from: dateRange.from.utc().format(), date_to: dateRange.to.utc().format() }; return this.loadSliceFromService(action, loadFilters); } else { return Observable.empty(); } }); } private createReceivePageEpic() { return (action$, store) => action$ .ofType(WorkingTimeJournalDetailActions.RECEIVE_PAGE) .map(action => { return {type: 'NOP'}; }); } /** * Загрузка данных среза пользователей из сервиса * @param action * @param filters */ private loadSliceFromService(action, filters?: any) { return this.service.getAll(filters) .map(data => { return this.actions.receivePage(action.meta.reportId, {items: data.items, total: data.total}); }); } } roor.epics.ts: @Injectable() export class RootEpics { constructor(private appEpics: AppEpics, private groupsEpics: GroupsEpics, private workingTimeJournalDetailEpics: WorkingTimeJournalDetailEpics, ............................................................................................................... ) { } public createEpics() { return [ this.appEpics.createAppEpics(), this.groupsEpics.createEpic(), this.workingTimeJournalDetailEpics.createEpic(), ............................................................................. ]; } } store.module.ts: @NgModule({ imports: [ NgReduxModule, WorkingTimeJournalDetailModule, ........................................................ ], providers: [RootEpics, GroupsEpics], }) export class StoreModule { constructor(ngRedux: NgRedux<AppStateInterface>, devTools: DevToolsExtension, rootEpics: RootEpics) { if (!environment.production) { const storeEnhancers = devTools.isEnabled() ? [devTools.enhancer()] : []; ngRedux.configureStore( rootReducer, INITIAL_STATE, [ ...rootEpics.createEpics() ], storeEnhancers ); } else { ngRedux.configureStore(rootReducer, INITIAL_STATE, [...rootEpics.createEpics()]); } } } |
okuznetsov1,
Не разобраться без запускаемого тестового примера. Сделайте репозиторий в github с проблемой и шагами, как её воспроизвести. |
разобрался, нашёл проблему. после того как открывался отчёт в 1-ый раз - в catch должно было прийти сообщение об ошибке, но не оно терялось при передаче, при этом данная ошибка "гасилась" браузером и он о ней не сообщал в консоли. Поэтому складывалось такое впечатление, что вроде бы всё хорошо должно работать, но по не понятным причинам "не работало".
|
Часовой пояс GMT +3, время: 10:51. |