如何结合两个可观察角度的结果?

时间:2017-08-05 04:43:15

标签: angular

如何组合两个可观察角度的结果?

this.http.get(url1)
    .map((res: Response) => res.json())
    .subscribe((data1: any) => {
        this.data1 = data1;
    });

this.http.get(url2)
    .map((res: Response) => res.json())
    .subscribe((data2: any) => {
        this.data2 = data2;
    });

toDisplay(){
  // logic about combining this.data1 and this.data2;
}

以上是错误的,因为我们无法立即获取data1和data2。

this.http.get(url1)
    .map((res: Response) => res.json())
    .subscribe((data1: any) => {
    this.http.get(url2)
        .map((res: Response) => res.json())
        .subscribe((data2: any) => {
            this.data2 = data2;

            // logic about combining this.data1 and this.data2
            // and set to this.data;
            this.toDisplay();
        });
    });

toDisplay(){
  // display data
  // this.data;
}

我可以在第二个observable的subscribe方法中组合结果。 但我不确定实现我的要求是否是一个好习惯。

更新
我找到的另一种方法是使用forkJoin来组合结果并返回一个新的observable。

let o1: Observable<any> = this.http.get(url1)
    .map((res: Response) => res.json())

let o2: Observable<any> = this.http.get(url2)
    .map((res: Response) => res.json());

Observable.forkJoin(o1, o2)
  .subscribe(val => {  // [data1, data2]
    // logic about combining data1 and data2;
    toDisplay(); // display data
});

toDisplay(){
  // 
}

4 个答案:

答案 0 :(得分:12)

一个很好的方法是使用rxjs forkjoin运算符(它包含在Angular btw中),这使你远离嵌套的异步函数地狱,你必须在使用回调函数后嵌套函数。

这是一个关于如何使用forkjoin(以及更多)的精彩教程:

https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs

在示例中,您创建了两个http请求,然后在订阅胖箭头函数中,响应是一个结果数组,您可以根据需要将它们组合在一起:

let character = this.http.get('https://swapi.co/api/people/1').map(res => res.json());
let characterHomeworld = this.http.get('http://swapi.co/api/planets/1').map(res => res.json());

Observable.forkJoin([character, characterHomeworld]).subscribe(results => {
  // results[0] is our character
  // results[1] is our character homeworld
  results[0].homeworld = results[1];
  this.loadedCharacter = results[0];
});

数组中的第一个元素始终对应于您传入的第一个http请求,依此类推。几天前我成功地使用了这个,同时有四个请求,它运行得很好。

答案 1 :(得分:1)

如果不起作用请尝试使用forkJoin,然后尝试 combineLatest() 它的作用-在完成流数组之前,它将流数组中最后发出的值合并为一个。

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)
    );

答案 2 :(得分:0)

我们可以根据需要以不同方式组合可观察对象。我有两个问题:

  1. 第一个的响应是第二个的输入:flatMap()为 在这种情况下合适。
  2. 两者都必须先完成,然后才能继续:可以根据需要使用forkJoin()/ megre()/ concat() 您的输出。

您可以找到上述所有功能here的详细信息。 您可以找到更多可以执行的操作,以结合可观察物here

答案 3 :(得分:-1)

你需要一个zip运算符,一旦两个observable都发出值,就会发出一个值。

参考:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-zip