Angular - 检测两个订阅何时更新

时间:2017-11-16 20:10:06

标签: javascript angular typescript promise subscribe

在组件中,在ngOnInit()中,我有两个订阅数据服务。我想在两个订阅都返回后进行一些处理。什么是最好的方法呢?我可以在每个结尾处理,这看起来效率有点低,并且无法首先激活订阅,

谢谢,

Component.TS

ngOnInit()
{
  this.dataService.dataA().subscribe((dataAJSON) => 
 {
   this.dataA= dataAJSON
 }

 this.dataService.dataB().subscribe((dataBJSON) => 
 {
   this.dataB= dataBJSON
 }

的DataService

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';

@Injectable()

export class PMDataService
{
  constructor(public http : Http)
  {

  }

  dataA()
  {

    var dataA: any;
    var json;

    dataA= this.http.get("./assets/dataa.json")
      .map(res => res.json());

    return dataA
  }

  dataB()
  {

    var dataB: any;
    var json;

    dataB= this.http.get("./assets/datab.json")
      .map(res => res.json());

    return dataB
  }

}

4 个答案:

答案 0 :(得分:2)

您可以在Observables上使用Observable#forkJoin功能。当所有可观测量完成时,它会从每个值中发出最后一个值,

Observable.forkJoin(this.dataService.dataA(), this.dataService.dataB())
          .subscribe(val => /* val is an array */)

答案 1 :(得分:2)

使用的方法取决于您希望如何接收数据:

您可以使用zip功能。当所有人都发射一次时发射一次。与Promise.all类似,但完成时除外。

Observable.zip(obs1, obs2).subscribe((val) => { ... });

您可以使用forkJoin功能。一切都完成后发出一次。完全像Promise.all

Observable.forkJoin(obs1, obs2).subscribe((val) => { ... });

您可以使用merge功能。按排放顺序排放,因此可以是第1次,然后是第2次或第2次,然后是第1次:

obs1.merge(obs2).subscribe((val) => { ... });

您可以使用concat功能。无论第二次发射第二次发射顺序是第一次到第二次:

obs1.concat(obs2).subscribe((val) => { ... });

为了清晰起见,最好将它们分成几行。

const obs1 = Rx.Observable.of(1,2,3);
const obs2 = Rx.Observable.of(1,2,3);
const example = Observable.zip(obs1, obs2);
//const example = Observable.forkJoin(obs1, obs2);
//const example = obs1.merge(obs2);
//const example = obs1.concat(obs2);
example.subscribe(val => { ... });

答案 2 :(得分:0)

您可以使用rxjs中的运算符ZipCombineLatest

请参阅ReactiveX operators

你可以这样做:

    Observable.zip(
        this.http.get("./assets/dataa.json"),
        this.http.get("./assets/dataa.json")
    .take(1)
    .map(values => [values[0].json(), values[1].json()])
    .subscribe(values => {
        // do something with my values
    });

答案 3 :(得分:0)

你可以使用concat来组合observable并返回一个observable。

  

按先前完成的顺序订阅observable,发出值

更改了服务代码

import 'rxjs/add/operator/concat';

export class PMDataService
{
  data(){
    return this.dataA().concat(this.dataB());
  }
  // methods dataA and dataB are unchanged, some of the constructor
}

组件代码

ngOnInit(){
  this.dataService.data().subscribe((dataJSON) => 
     {
       this.dataA= dataAJSON[0];
       this.dataB= dataAJSON[1];
     }
}