所有服务调用完成时的触发方法

时间:2017-03-13 01:04:00

标签: angular typescript

我有一个组件可以对服务进行两次调用以获取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,我会在视图模板中进行迭代。

我应该使用什么机制来做这件事?

2 个答案:

答案 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似乎更有用,作为一个方便的算子放在口袋里。

相关问题