使用ngrx的解析器中的catchError,一直工作到状态已存在

时间:2018-10-18 16:20:55

标签: angular rxjs angular6 ngrx

我有一个解析器,导航到另一个页面时,它有一个productThroughStore$观察对象,它检查状态是否存在具有该ID的产品,如果存在,将其传递给Race Operator和使用它,但如果不使用它,它将过滤通过,productThroughService可观察到的结果将其切换到switchMap,该switchMap调用DataFetcher服务中的方法,该服务发出HTTP请求,然后在成功时将产品存储为状态。 >

当请求出现错误时,会出现catchError,将错误重新抛出给Race运算符,然后Race运算符将分派一个操作以更新状态中的错误标志。

现在,即使用户导航到页面并且DataFetcher服务引发错误,这一切都可以正常工作,它会捕获错误并将错误标志切换为true以反映在UI中,并且用户可以尝试导航现在转到另一个页面,只要代码进入productThroughService中可观察到的switchMap,一切都将起作用。如果这仍然不起作用,则在先前的路线导航之后会导致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);
      })
    );
  }

0 个答案:

没有答案