如何合并多个嵌套的角度展平运算符?

时间:2019-09-01 18:46:23

标签: angular typescript rxjs

我正在尝试使用多个函数的Observables结果。有些需要顺序运行,有些则不需要。另外,第一个结果需要传递给一些嵌套的结果。

我看了多个例子。但是,我似乎无法弄清楚这种特殊的组合。语法让我感到困惑。

假设您具有以下函数,每个函数都返回一个Observable。

saveContactDetails(): Observable<ContactDetails> {
    // Returns single observable with single ContactDetails.
}

savePhones(contactId: string): Observable<Phone[]> {
    // Returns single observable with array of Phones.
}

saveEmails(contactId: string): Observable<Email[]> {
    // Returns single observable with array of Emails.
}

saveAll(): Observable<Contact> {
    // TODO: Can't figure out the login/syntax here.
}

步骤:

  1. 调用saveContactDetails()。仅在完成之后,继续。
  2. 使用saveContactDetails()的结果,调用savePhones()和saveEmails()。这两个功能(可能还有更多)可以无特定顺序并行运行。
  3. 所有“子级”可观察对象完成后,将所有(父级和子级)的结果合并到单个Observable中,以从saveAll()返回。

我假设我需要使用concatMapmergeMap(或者也许是forkJoin)。但同样,我似乎无法使用在线文档和示例来弄清楚语法。

1 个答案:

答案 0 :(得分:1)

看起来像这样。

您将Map切换为需要从第一个输入的那些的forkJoin。然后使用内部地图来组合所有3个结果。

  saveAll(): Observable<Contact> {
    return this.saveContactDetails().pipe(
      switchMap(contactDetails => forkJoin([
          this.savePhones(contactDetails.id), // however you get the id
          this.saveEmails(contactDetails.id)
        ]).pipe(
          map(([phones, emails]) => 
            Object.assign(contactDetails, {phones, emails})) // whatever your transform is
        )
      )
    );
  }