在组件中,在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
}
}
答案 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中的运算符Zip
或CombineLatest
。
你可以这样做:
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];
}
}