我有一个组件,可以对服务进行两个调用以获取2组数据。
我希望我的组件根据逻辑显示数据,该逻辑需要两个调用的数据。
当两个服务请求返回可观察的方法时,如何制作处理数据触发的方法?
这是我到目前为止所拥有的:
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
。
我应该用什么机制来执行此操作?
,如果您必须观察到只发出单个结果(例如,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)。
请参阅此处以获取运算符文档。
类似于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需要两个或多个源可观察物,并且当所有观察到至少发出一个值时,将发出其第一个值。发射的组合值是从每个源可观察物发出的所有最后一个值的数组。
请参阅CombineLatest的RXJS文档
在您处理单个发出的可观察物的示例中,两个操作员之间没有很大的区别,但是CombineLatest似乎作为一个方便的操作员可以在您的口袋中使用。