我有一个解析器,导航到另一个页面时,它有一个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); }) ); }