使用RxJS构建复杂的互连请求

时间:2019-02-18 12:31:57

标签: angular typescript rxjs

我有一个应该首先提出的要求。它在数据库中创建一个初始行,该行用于将我要保存在其他表中的下一行与该初始行(一对多关系)连接起来。因此,我编写了一个使用switchMap发出下一个请求的请求。

但是,现在我需要用另一张也与首字母相连并具有自己后代的卡重复该过程。

看起来像这样

Main card // has id
-> card details 1   // uses main card id to connect
-> card details 2   // uses main card id to connect
--> sub card        // uses main card id to connect AND has subCardId
   -> sub details 1 // uses subCardId to connect

所以我写了这个

this.myService.send(...).pipe(
  map(resp => resp.id),
  switchMap(cardId => {
    return forkJoin([
      this.myService.sendQueue(...), // returns a "concat"
      this.myService.send(...).pipe( // here I try to save my subCard
        map(subResp => subResp.id)
        switchMap(subId => {         // and save subOptions to this
          return this.myService.sendQeue(...)
        })
      )
    ]);
  }
).subscribe(resp => console.log(resp))

因此,我可以在Network中看到它确实发送了请求:

1)保存主卡

2)保存卡的选项

3)保存子卡

但是,没有来自内部switchMap的请求


更新#1

事实证明,即使sendQueue返回concat可观察到的(通常一一订阅所有可观察到的东西),它也只对API进行一次调用,而不是为每个传递的元素进行调用。同时,如果我在没有复杂逻辑的情况下进行相同的操作,那么一切都会按预期进行(两种情况下都假定参数集相同)。

以防万一,

public sendQueue(list: any[]) {
    const observables = list.map(({request, transferData}) => this.send(request, transferData));

    return concat(...observables);
}

更新#2

我将forkJoin更改为concat,这解决了并非所有请求都已运行的问题。但是,由于它们是独立的,因此我想并行运行它们。

0 个答案:

没有答案