我有一个组件可以对服务进行两次调用以获取2组数据。
我希望我的组件根据需要两次调用数据的逻辑显示数据。
当两个服务请求都返回一个observable时,如何使我的方法处理数据触发器?
这是我到目前为止所做的:
ngOnInit(): void {
//get message contents
this._pageSpeedService.getMessageData()
.subscribe(results => this.messageData = <TestResultMessageLogic[]>results,
error => this.errorMessage = <any>error);
//get data to show what messages to show
this._pageSpeedService.getResults(this.testUrl)
.subscribe(results => this.testResults = results,
error => this.errorMessage = <any>error);
}
processApiRespone(testResults: IPageSpeedResult, messageData: TestResultMessageLogic[]): void{
this.testResults = testResults;
this.alerts = [];
for(let testLogic of messageData)
{
// .. logic is here, omitted for brevity
this.alerts.concat(builtData);
}
所以当我有this.messageData
&amp; this.testResults
返回数据后,我需要运行processApiRespone()
才能创建this.alerts
,我会在视图模板中进行迭代。
我应该使用什么机制来做这件事?
答案 0 :(得分:2)
如果您需要只发出一个结果的可观察量(例如http呼叫),您可以使用forkJoin
运算符
Observable.forkJoin(this._pageSpeedService.getMessageData,
this._pageSpeedService.getResults(this.testUrl))
.subscribe(result => {
this.messageData = result[0];
this.testResults = result[1];
//now process the response
this.processApiResponse(this.testResults, this.messageData);
});
我们在项目中使用它来在加载页面时等待一些http调用(同时显示微调器/加载UI)。
有关操作员文档,请参阅here。
答案 1 :(得分:1)
与forkJoin类似,您也可以使用Observable.combineLatest。
导入:
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/combineLatest';
使用运营商:
Observable.combineLatest(this._pageSpeedService.getMessageData,
this._pageSpeedService.getResults(this.testUrl))
.subscribe(result => {
this.messageData = result[0];
this.testResults = result[1];
//now process the response
this.processApiResponse(this.testResults, this.messageData);
});
Observable.combineLatest接受两个或多个源可观察对象,并且当所有可观察者都发出至少一个值时,将发出其第一个值。发出的组合值是从每个源可观察数据发出的所有最后值的数组。
See the RxJS documentation for combineLatest
以你处理单个发射可观测量的例子来说,两个运算符之间没有太大区别,但combineLatest似乎更有用,作为一个方便的算子放在口袋里。