繁体   English   中英

如何在 Angular / RxJS 中链接服务器调用?

[英]How to chain server calls in Angular / RxJS?

我正在尝试组织我的代码,以便对服务器的一次调用发生在另一次调用之后。 我相信这是一个非常普遍的问题,但我仍在努力理解其他答案并将它们应用于我的具体情况。

我的组件需要 go 按此顺序执行 3 个步骤:load、restoreState 和 fetchData。

这是我的代码:

  private load() {
    this.httpClient.get(this.endpoint1).subscribe(res => {
      this.pageTitle = res.pageTitle;
      this.pageInfo = res.pageInfo;
    })
  }

  private restoreState() {
    // restore state of page (no server calls needed)
    this.filters = this.processFilters(sessionStorage.getItem(this.pageTitle));
  }

  private fetchData() {
    this.httpClient.get(this.endpoint2, this.filters).subscribe(res => {
      this.populatePage(res);
    })
  }

我在想 ngOnInit() 应该看起来像这样:


  ngOnInit(): void {
    this.load().subscribe(() => {
      this.restoreState();
      this.fetchData();
    })
  }

但是,我不太确定如何让它工作。 根据我的研究,我认为它可能与 mergeMap() 或 concatMap() 有关,但我不确定如何让它工作。

使用switchMap

private load(endpoint) {
    return this.httpClient.get(endpoint);
}

private restoreState(pageTitle) {
    // restore state of page (no server calls needed)
    return this.processFilters(sessionStorage.getItem(pageTitle));
}

private fetchData(endpoint, filter) {
    return this.httpClient.get(endpoint, filter);
}

ngOnInit(): void {
    this.load(this.endpoint1).pipe(
        tap(({ pageTitle }) => this.pageTitle = pageTitle),
        tap(({ pageInfo }) => this.pageInfo = pageInfo),
        map(({ pageTitle }) => this.restoreState(pageTitle)),
        tap(( filters ) => this.filters = filters),
        switchMap(( filters ) => this.fetchData(this.endpoint2, filter))
    ).subscribe( res => this.populatePage(res));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM