【问题标题】:RxJS forkjoin observables not retrievingRxJS forkjoin observables 未检索
【发布时间】:2021-03-10 10:38:07
【问题描述】:

我需要获取 3 个 API 数据,然后我需要将 Subsidary 与 company 合并,然后合并到 main 以构建最终对象。

我在我的服务文件中写了下面的http请求。

getStaticContent$(): Observable<{
    mainStaticContent$: ObjectList;
    companyStaticContent$: ObjectList;
    subsidaryStaticContent$: ObjectList;
  }> {
    const mainStaticContent$: Observable<ObjectList> = this.http.get<ObjectList>(
      this.apiService.mainURL
    );
    const companyStaticContent$ = this.http.get<ObjectList>(
      this.apiService.companyURL
    );
    const subsidaryStaticContent$ = this.http.get<ObjectList>(
      this.apiService.subsiderayURL
    );

    return forkJoin({
      mainStaticContent$,
      companyStaticContent$,
      subsidaryStaticContent$,
    });
  }

我无法在 Angular 解析器服务中获取这些数据,我需要在其中执行一些逻辑,然后返回最终的 ObjectList。请参阅我的以下代码并提出建议。我是 rxJS 新手,无法解决此问题

export class DataResolverService implements Resolve<ObjectList> {
  constructor(private dataService: DataService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot
  ):
    | ObjectList
    | import('rxjs').Observable<ObjectList>
    | Promise<ObjectList> {
      

    return this.dataService.getStaticContent$().pipe(
      tap(
        ([
          mainStaticContent: any,
          companyStaticContent,
          subsidaryStaticContent,
        ]) => {
          // perform merge opration
          // then return ObjectList
          return objectList;
        }
      )
    );
  }
}

【问题讨论】:

  • 您能否更具体一点 - 什么不是检索?你有任何错误吗?我没有看到任何订阅 getStaticContent$()
  • @NicholasK 错误是 must have a '[Symbol.iterator]()' method that returns an iterator
  • tap 运算符是一个运算符,它不会改变任何值,它只会对值做一些事情。请改用map 运算符。
  • @MoxxiManagarm 是的,它使用以下解决方案与地图一起使用

标签: angular rxjs pipe fork-join


【解决方案1】:
  • 如果您发送forkJoin 一个对象,那么您将获得一个对象作为回报。不是数组。你在你的方法签名中得到了这个,但在你的使用中却没有

  • Tap 返回它接收到的相同流。您传递的函数tap 的返回类型应为 void,因此任何返回都将被忽略。

    return this.dataService.getStaticContent$().pipe(
      tap(
        ({ // <- Object not array
          mainStaticContent$,
          companyStaticContent$,
          subsidaryStaticContent$,
        }) => {
          // perform merge opration
          // then return ObjectList
          return objectList; // <- Tap ignores this
        }
      )
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多