Angular RxJS等待observable,然后创建另一个observable,以此类推

Angular RxJS等待observable,然后创建另一个observable,以此类推,angular,rxjs,Angular,Rxjs,我在前端有一个树状结构,可能看起来像上图中的树。 由于后端的设计方式,我必须单独持久化每个节点。但要持久化一个节点,它必须知道它的父id。我决定以自上而下、深度优先的顺序持久化节点,即[a、b、d、e、c] 我使用HttpClient.post()返回一个可观察的。要持久化b我必须等待HttpClient.post(a)返回a的id,这是持久化b所需要的 我能想象的唯一方式。详情如下: of(1).pipe( mergeMap(() => httpClient.post(a)),

我在前端有一个树状结构,可能看起来像上图中的树。 由于后端的设计方式,我必须单独持久化每个节点。但要持久化一个节点,它必须知道它的父id。我决定以自上而下、深度优先的顺序持久化节点,即
[a、b、d、e、c]

我使用HttpClient.post()返回一个可观察的。要持久化
b
我必须等待
HttpClient.post(a)
返回
a
的id,这是持久化
b
所需要的

我能想象的唯一方式。详情如下:

of(1).pipe(
   mergeMap(() => httpClient.post(a)),
   tap(idOfA => b.parentId = idOfA),
   tap(idOfA => c.parentId = idOfA),
   mergeMap(() => httpClient.post(b)),
   tap(idOfB => d.parentId = idOfB),
   tap(idOfB => e.parentId = idOfB),
   mergeMap(() => httpClient.post(d)),
   mergeMap(() => httpClient.post(e)),
   mergeMap(() => httpClient.post(c))
).subscribe();
您可以忽略
tap()
内容,因为它会在后台自动发生。这只是为了弄清楚,为什么要求取决于他们的父母要求返回。它看起来是这样的:

of(1).pipe(
   mergeMap(() => httpClient.post(a)),
   mergeMap(() => httpClient.post(b)),
   mergeMap(() => httpClient.post(d)),
   mergeMap(() => httpClient.post(e)),
   mergeMap(() => httpClient.post(c))
).subscribe();
发出一个请求,等待它返回,发出另一个请求,等等。我上面实现的东西适用于任何5个节点的预排序列表。问题是,对于一个可变大小的列表,我必须动态地这样做


您能告诉我如何在任何类型的循环或类似循环的构造中执行此操作吗?

您可以使用
concatMap()
parentId
变量存储最新的父Id-

parentId: any;
  
of(a, b, c, d) // or you can also pass an array using from([a, b,c ,d])
.pipe(concatMap(val => httpClient.post('url', { parentId: this.parentId })))
.subscribe(res => {
  this.parentId = res.id;
  console.log(res);
});

它就像一个符咒,比我所有失败的尝试都容易。谢谢。:)