我已经在RXJS库的帮助下创建了嵌套的http调用:
this.http.get('/api/people/1').subscribe(character => {
this.http.get(character.homeworld).subscribe(homeworld => {
character.homeworld = homeworld;
this.loadedCharacter = character;
});
但是我的一些见解告诉我,使用流和RXJS从API提取数据的正确方法是:
this.homeworld = this.http
.get('/api/people/1')
.pipe(mergeMap(character => this.http.get(character.homeworld)));
请告诉我为什么第二种方法比第一种更好。为什么我应该使用mergemap以及为什么它比使用嵌套的http调用更好??
这与嵌套的http调用无关,而与RxJS反模式的嵌套订阅有关。RxJS是一个以反应方式和声明方式解决问题的库。这意味着应将应用程序中的数据流描述为流。RxJS中的良好模式假定整个流应被编写为一个延迟加载的流。就您而言,整个流程为:fetch person with id=1 -> determine homeworld -> fetch homeworld
。因此,您实际上并不在乎人的细节,而在乎homeworld
。请注意,在第二种情况下,您不调用任何http方法,您只能编写惰性流。它允许您就地使用此流或在不存储状态的情况下在其他位置订阅它。这是一个巨大的优势,因为您不必关心状态或中间状态(命令式方法)。
此外,当您使用时,您.subscribe()
可以创建应在服务/组件生命周期中进行管理的订阅。如果创建一个流流,则仅创建一个订阅,因此订阅管理更加简单。我知道,http.get / post可观察的是在获取数据后完成的,但是如果将组件保留在进行HTTP调用的地方该怎么办?代码将在不存在的范围内执行副作用。
我认为您也可以在https://medium.com/angular-in-depth/when-to-subscribe-a83332ae053中找到很好的解释
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句