【问题标题】:combine multiple http calls in RxJS在 RxJS 中组合多个 http 调用
【发布时间】:2021-02-21 11:23:13
【问题描述】:

我是 rxjs 新手。

我正在尝试组合几个 observables 以从 rest api 获取数据列表并加载到 ngx-datatable

按照server-side paging on ngx-datatable example,我定义了一个PageData对象:

export class PagedData<T> {
  data = new Array<T>();
  page = new Page();
}

我的组件中有一个有效的 setPage 方法来检索我的用户列表:

setPage(pageInfo) {
    this.page.pageNumber = pageInfo.offset;
    this.pageObserver = this.userService.getPaged<User>(this.page).subscribe(pagedData => {
      this.page = pagedData.page;
      this.rows = pagedData.data;
    });
  }

现在我必须用其他一些逻辑来改进这个解决方案。 我的休息服务器中的用户对象具有这种形式:

{
        "createdAt": "2021-02-20T13:06:23.911Z",
        "firstname": "Roberto",
        "id": 7,
        "lastname": "Rossetti",
        "links": [
            {
                "saleforces": "/users/7/saleforces"
            }
        ],
        "name": "robertorossetti",
        "parent": null,
        "parentId": null,
        "updatedAt": "2021-02-20T13:06:23.933Z",
        "users": []
    }

所以我需要点击链接“/users/7/saleforces”来检索与我的用户相关的销售队伍。 在这里我被卡住了。

按照我找到的示例here,我尝试实现一个新的可观察对象,以这种方式扩展我的工作代码

public getPagedWithSaleForce2(page: Page, queryParams?: QueryStringParameters, options?: HttpOptions): Observable<PagedData<User>> {
    return super.getPaged<User>(page, queryParams, options).pipe(
      switchMap((pagedData: PagedData<User>) => {
        if (pagedData.data.length > 0) {
          return forkJoin(
            pagedData.data.map((user: User) => {
              const saleForceEndpoint = _.find(user.links, 'saleforces');
              return this.getRaw<SaleForce>(saleForceEndpoint.saleforces).pipe(
                map((saleForce: SaleForce[]) => {
                  user.saleForces = saleForce;
                  return (user);
                })
              );
            })
          );
        } else {
          return of(null);
        }
      })
    );
  }

显然这段代码不起作用。

那么,我如何用由他们的 saleForces 丰富的用户数组填充我的 pageData.data? 如何并行调用 saleForceEndpoint?

提前感谢您的帮助

【问题讨论】:

    标签: angular rxjs angular-httpclient ngx-datatable


    【解决方案1】:

    我找到了将问题一分为二的解决方案:

    在我的控制器中:

    # user-list.component.ts
    setPage(pageInfo) {
        this.page.pageNumber = pageInfo.offset;
        this.pageObserver = this.userService.getPagedWithSaleForce(this.page).subscribe(pagedData => {
          this.page = pagedData.page;
          this.rows = pagedData.data;
        });
      }
    

    为我服务:

    # user.service.ts
    public getPagedWithSaleForce(page: Page, queryParams?: QueryStringParameters, options?: HttpOptions): Observable<PagedData<User>> {
        return super.getPaged<User>(page, queryParams, options)
          .pipe(
            mergeMap((pagedData: PagedData<User>) => {
              return this.followSaleforceLink(pagedData).pipe(
                map(users => {
                  return {users, pagedData};
                })
            );
            }),
            map(({users, pagedData}) => {
              pagedData.data = users;
              return pagedData;
            })
          );
      }
    
      public followSaleforceLink(pagedData: PagedData<User>): Observable<User[]> {
        return forkJoin(
          pagedData.data.map((user: User) => {
            const saleForceEndpoint = _.find(user.links, 'saleforces');
            return this.getRaw<SaleForce>(saleForceEndpoint.saleforces).pipe(
              map((saleForce: SaleForce[]) => {
                user.saleForces = saleForce;
                return user;
              })
            );
          })
        );
      }
    

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2022-01-25
      • 2021-06-26
      • 2021-10-23
      相关资源
      最近更新 更多