如何解决RxJS等待可观察的然后创建另一个可观察的,依此类推
我在前端有一个类似树的结构,从上图中看起来可能像树。
由于这种方式,后端是经过设计的,因此我必须分别持久保存每个节点。但是要保留一个节点,它必须知道它的父母ID。我决定以自上而下,深度优先的顺序([a,b,d,e,c]
)保留节点。
我使用HttpClient.post()返回一个Observable。要持久保存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(c))
).subscribe();
发出请求,等待它返回,再发出另一个请求,依此类推。我上面实现的内容适用于5个节点的任何预排序列表。问题是,我必须动态地执行此操作,以获取可变大小的列表。
能否请您提示我如何在任何循环或类似构造的循环中执行该操作?
解决方法
您可以使用concatMap()
和parentId
变量存储最新的父ID-
parentId: any;
of(a,b,c,d) // or you can also pass an array using from([a,d])
.pipe(concatMap(val => httpClient.post('url',{ parentId: this.parentId })))
.subscribe(res => {
this.parentId = res.id;
console.log(res);
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。