Javascript 如何将两个可观察角度的结果结合起来?
如何将两个可观察角度的结果结合起来Javascript 如何将两个可观察角度的结果结合起来?,javascript,angular,Javascript,Angular,如何将两个可观察角度的结果结合起来 this.http.get(url1) .map((res:Response)=>res.json()) .订阅((数据1:any)=>{ this.data1=data1; }); this.http.get(url2) .map((res:Response)=>res.json()) .订阅((数据2:任何)=>{ this.data2=data2; }); toDisplay(){ //关于组合this.data1和this.data2的逻辑; } 以
this.http.get(url1)
.map((res:Response)=>res.json())
.订阅((数据1:any)=>{
this.data1=data1;
});
this.http.get(url2)
.map((res:Response)=>res.json())
.订阅((数据2:任何)=>{
this.data2=data2;
});
toDisplay(){
//关于组合this.data1和this.data2的逻辑;
}
以上是错误的,因为我们无法立即获取数据1和数据2
this.http.get(url1)
.map((res:Response)=>res.json())
.订阅((数据1:any)=>{
this.http.get(url2)
.map((res:Response)=>res.json())
.订阅((数据2:任何)=>{
this.data2=data2;
//关于组合this.data1和this.data2的逻辑
//并设置为该值。数据;
这个。toDisplay();
});
});
toDisplay(){
//显示数据
//这是数据;
}
我可以将结果合并到第二个可观测值的subscribe方法中。
但我不确定这是否是一个很好的实践来达到我的要求
更新:我发现的另一种方法是使用
forkJoin
组合结果并返回一个新的可观察对象
让o1:Observable=this.http.get(url1)
.map((res:Response)=>res.json())
设o2:Observable=this.http.get(url2)
.map((res:Response)=>res.json());
可观察的分叉连接(o1,o2)
.subscribe(val=>{/[data1,data2]
//关于组合数据1和数据2的逻辑;
toDisplay();//显示数据
});
toDisplay(){
//
}
编辑2021:以下是更新的教程:
一个很好的方法是使用rxjs forkjoin操作符(附带Angular btw),这使您远离嵌套异步函数地狱,您必须使用回调函数一个接一个地嵌套函数
下面是一个关于如何使用forkjoin(以及更多)的精彩教程:
在本例中,您发出两个http请求,然后在subscribe fat arrow函数中,响应是一个结果数组,您可以根据需要将这些结果组合在一起:
let character=this.http.get('https://swapi.co/api/people/1.map(res=>res.json());
让characterHomeworld=this.http.get('http://swapi.co/api/planets/1.map(res=>res.json());
Observable.forkJoin([character,characterHomeworld])。订阅(结果=>{
//结果[0]是我们的特色
//结果[1]是我们的性格家园
结果[0]。家庭世界=结果[1];
this.loadedCharacter=结果[0];
});
数组中的第一个元素始终对应于传入的第一个http请求,依此类推。几天前,我在四个同时请求的情况下成功地使用了它,它工作得非常好。我们可以根据需要以不同的方式组合观测值。我有两个问题:
您可以找到更多可以执行的操作来组合观测值。尝试使用forkJoin,如果它不起作用,请尝试使用它CombineTest() 它的作用-在流数组完成之前,它将流数组中最后发出的值合并为一个值
Observable.combineLatest(
this.filesServiceOberserval,
this.filesServiceOberserval,
this.processesServiceOberserval,
).subscribe(
data => {
this.inputs = data[0];
this.outputs = data[1];
this.processes = data[2];
},
err => console.error(err)
);
你的更新真的应该是一个。一些可观察到的内容,如
route.url
(route:ActivatedRoute)不完整,在这种情况下:小旁注,它的用法是forkJoin([character,characterHomeworld]),不可观察。forkJoin([character,characterHomeworld],根据你的文章链接:)