catchError в распознавателе с ngrx, работает, пока элемент не существует в состоянии - PullRequest
0 голосов
/ 18 октября 2018

У меня есть этот преобразователь, который при переходе на другую страницу имеет наблюдаемую 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);
      })
    );
  }
...