Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将两个可观察角度的结果结合起来?_Javascript_Angular - Fatal编程技术网

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请求,依此类推。几天前,我在四个同时请求的情况下成功地使用了它,它工作得非常好。

我们可以根据需要以不同的方式组合观测值。我有两个问题:

  • 第一个的响应是第二个的输入:flatMap()是 适合这种情况
  • 这两个步骤都必须在继续之前完成:根据需要,可以使用forkJoin()/megre()/concat() 您的输出
  • 您可以找到上述所有函数的详细信息。
    您可以找到更多可以执行的操作来组合观测值。

    尝试使用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],根据你的文章链接:)