У меня есть этот преобразователь, который при переходе на другую страницу имеет наблюдаемую productThroughStore$
, которая проверяет, существует ли продукт с таким идентификатором в состоянии, и если он существует, он проходит к оператору гонки и использует его., но если это не так, он фильтруется, и наблюдаемая productThroughService
попадает в switchMap, который вызывает метод из службы DataFetcher, которая делает HTTP-запрос, а затем сохраняет этот продукт в состоянии в случае успеха.
Когда в запросе возникает ошибка, есть catchError, которая повторно выдает ошибку оператору гонки, который затем отправляет действие для обновления флага ошибки в состоянии.
Теперь все это работает в основном нормально, дажекогда пользователь переходит на страницу, а служба DataFetcher выдает ошибку, он улавливает ошибку и переключает флаг ошибки в значение true, чтобы отразить в пользовательском интерфейсе, и пользователь может попытаться перейти на другую страницу сейчас и до тех пор, покакод переходит к switchMap в наблюдаемой productThroughService
, все будет работать.Если это не работает, тогда выполняется ПОСЛЕ предыдущей навигации по маршруту, которая приводит к catchError, и пользователь теперь пытается перейти к другому маршруту, где продукт уже существует в состоянии.Он ведет к маршруту, но ничего не происходит.Кроме того, если пользователь затем переходит к маршруту, где происходит switchMap, он снова работает.
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {
const productId: string = route.params['id'];
const lang = this.langService.getLanguage();
const URL = apiUrls.BASE_URL(this.originService.getOrigin()) + apiUrls.GET_PRODUCT_UNLOCALIZED(productId);
this.productThroughStore$ = this.store.pipe(
select(selectProductUnlocalizedById(productId)),
first(product => !!product)
);
this.productThroughService$ = this.store.pipe(
select(selectProductUnlocalizedById(productId)),
filter(product => !product),
switchMap(product => {
return this.dataFetcher.fetch(URL, lang).pipe(
tap(result => {
this.result = result;
this.store.dispatch(new ProductUnlocalizedDataLoaded(result));
}),
catchError((error) => {
return throwError(error);
})
);
})
);
return race(
this.productThroughService$,
this.productThroughStore$
).pipe(
catchError(error => {
this.store.dispatch(new ProductUnlocalizedDataError(error));
return of(this.result);
})
);
}