RxJs:如何调用当两个可观察的订阅工作是从不同的API终点完成
问题描述:
我加载数据的方法,然后做设定,在每个数据同步的一些工作:RxJs:如何调用当两个可观察的订阅工作是从不同的API终点完成
// Invoked by user interaction
loadData() {
this.service1.getData().subscribe(
data => {
this.doSynchronousWork(data);
this.data1 = data;
}
);
this.service2.getData().subscribe(
data => {
this.doSynchronousWork(data);
this.data2 = data;
}
);
}
// To be invoked when this.data1 and this.data2 is available
doSynchronousWorkWhenAllDataIsLoadedAndProcessed()
现在我需要调用另一种同步方法,当两个订阅都完成了他们的工作。我怎样才能做到这一点?
答
要做到这一点,您可以使用forkJoin
,在那里你把你所有的观测量作为一个数组和它们运行asynchronuously返回数据作为数组像这样
import { Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
console.log("Owk ooo let's play small with observables ");
// this is just to form an asynchronous process
asyncSimulator(data: number): Observable <any> {
return Observable.create(observer => {
setTimeout(() => {
observer.next("data to send can be object or anything" + data);
console.log("am done");
observer.complete(); //to show we are done with our processing
}, 2000);
})
}
/**
call the all asynchronous process here, like so with Fork Join
*/
Observable.forkJoin([
this.asyncSimulator(1),
this.asyncSimulator(2),
this.asyncSimulator(3),
])
.subscribe(results => {
let async1 = result[0];
let async2 = result[1];
let async3 = result[1];
console.log("results is an array", results);
});
希望这有助于。
嗯,对不起,我不明白。我的订阅()完成后如何获得另一个Observable?我可以添加一个完整的()处理程序。但我不知道该怎么做...... – Knack
哦,我只是用'asyncSimulator'方法模拟一个异步任务,最主要的是'forkJoin'看它是如何调用的,你将你的不同异步进程作为一个数组,然后订阅结果是按照您传递异步过程@Knack的顺序排列的结果数组 –