执行http请求时有多个forkjoin的rxjs

时间:2016-12-17 23:29:19

标签: angular rxjs angular2-http reactive-extensions-js

我正在做一些http请求并使用rxjs成功通知结果:

  getReportings(departmentId: number): Observable<any> {
        return Observable.forkJoin(
            this.http.get('/api/members/' + departmentId).map(res => res.json()),
            this.http.get('/api/reports/' + departmentId).map(res => res.json())
        );
    }

当两个http请求都完成后,我想在getReportings方法内部迭代报告数组,读取一些值,并为每个报告再次生成带有这些值的新http请求。

总而言之,我有2个(会员/报告)+ appr。 4到8(其他东西)请求。

当所有appr。完成了6到8个请求我希望从成功处理程序中的前6到8个请求中获取所有数据。

如何使用rxjs执行此操作?

更新

当用户olsn要求提供更多细节时,我理解他现在关注他的问题我在这里添加了更多数据(伪代码)6到8个请求应该是什么样子:

getReportings(departmentId: number): Observable<any> {
    return Observable.forkJoin(
        this.http.get('/api/members/' + departmentId).map(res => res.json()),
        this.http.get('/api/reports/' + departmentId).map(res => res.json())
    ).switchMap((result: [any[], any[]]) => {
        let members: any[] = result[0];
        let reports: any[] = result[1];
        let allNewStreams: Observable<any>[] = [
            Observable.of(members),
            Observable.of(reports)
        ]; 

        for(let report of reports)
        {
            allNewStreams.push(
this.http.get(report.url + ?key1=report.name1?).map(res => res.json()));
        }


        return Observable.forkJoin(allNewStreams); // will contain members, reports + 4-6 other results in an array [members[], reports[], ...other stuff]
    });
}

1 个答案:

答案 0 :(得分:4)

您可以使用switchMap扩展您的信息流,如下所示:

getReportings(departmentId: number): Observable<any> {
    return Observable.forkJoin(
        this.http.get('/api/members/' + departmentId).map(res => res.json()),
        this.http.get('/api/reports/' + departmentId).map(res => res.json())
    ).switchMap((result: [any[], any[]]) => {
        let members: any[] = result[0];
        let reports: any[] = result[1];
        let allNewStreams: Observable<any>[] = [
            Observable.of(members),
            Observable.of(reports)
        ];
        // do your stuff and push new streams to array...
        if (foo) { // for each additional request
            let reportId: string | number = reports[0].id; // or however you retrieve the reportId
            allNewStreams.push(
                this.http.get('some/api/ + bar)
                    .map(res => res.json())
                    .map(data => ({reportId, data})); // so your final object will look like this: {reportId: "d38f68989af87d987f8", data: {...}}
            );
        }

        return Observable.forkJoin(allNewStreams); // will contain members, reports + 4-6 other results in an array [members[], reports[], ...other stuff]
    });
}

这应该这样做,它更像是一种“旧式逻辑锤”方法 - 如果你正在寻找它:可能有一种更优雅的方法来解决这个问题其他运营商,但在不了解完整数据和所有逻辑的情况下很难说。