首页 > 解决方案 > Typescript 使用管道和清理转换 forkJoin 结果

问题描述

转换forkJoin ()结果的最佳方法是什么,所以在subscribe () 方法中我可以写如下内容:

this.refreshGraph(dependencies,microservices);

这是它现在的工作方式:

  loadAll(): void {
    const dependencies = this.dependencyService.query();
    const microservices = this.microserviceService.query();


    forkJoin({dependencies, microservices})
      .subscribe(results => {
        this.refreshGraph(results.dependencies.body || [], results.microservices.body || []);
      });
  }

  refreshGraph(dependencies: IDependency[], microservices: IMicroservice[]): void {
  ...
  }

我是否需要存储forkJoin () 的结果。订阅中的订阅()并在组件被销毁时手动取消订阅?在我的例子中, dependencyServicemicroserviceService只是包装http

  query(req?: any): Observable<EntityArrayResponseType> {
    const options = createRequestOption(req);
    return this.http.get<IDependency[]>(this.resourceUrl, { params: options, observe: 'response' });
  }

完整的源代码可在此处获得

标签: angulartypescriptrxjs

解决方案


这只是一点点重构。您可以在query()方法内部转换数据,也可以在方法内部进行loadAll()

以下是您可以重写loadAll()方法的一种方式。

 loadAll(): void {
    const dependencies = this.dependencyService.query().pipe(map(result => result.body || []));
    const microservices = this.microserviceService.query().pipe(map(result => result.body || []));;


    forkJoin({dependencies, microservices}).subscribe(
       ({dependencies, microservices}) => this.refreshGraph(dependencies,microservices)
    );
  }

请记住,如果提供给 forkJoin 的任何内部 observables 出现错误,您将失去任何其他已经完成或已经完成的 observables 的值。所以最好正确处理错误。您可以捕获错误并像这样返回一个空数组。

 const dependencies = this.dependencyService.query().pipe(
  map(result => result.body || []),
  catchError(() => of ([]))
);
const microservices = this.microserviceService.query().pipe(
  map(result => result.body || []),
  catchError(() => of ([]))
);

而且你也不需要在这里手动取消订阅,因为 observable 是由 Angular 的 httpClient 服务创建的。看到这个帖子。一旦所有内部可观察对象完成,forkJoin 将自动完成。我希望这将有所帮助。


推荐阅读