首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行http请求时具有多个叉联接的rxjs

在执行http请求时具有多个叉联接的rxjs
EN

Stack Overflow用户
提问于 2016-12-17 23:29:18
回答 1查看 5.1K关注 0票数 1

我正在执行一些http请求,并使用rxjs成功地通知结果:

代码语言:javascript
复制
  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方法中迭代reports数组,读取一些值,并为每个报表再次发出一个带有这些值的新http请求。

总之,我有两个(成员/报告)+应用程序。4至8(其他东西)请求。

当所有的人。6到8个请求已经完成,我希望在成功处理程序中从前面的6到8个请求中获取所有数据。

我怎样才能用rxjs做到这一点呢?

更新

由于用户olsn要求提供更多的详细信息,我现在了解了他的担忧,我在这里输入了更多数据(伪代码),6到8个请求应该是什么样的:

代码语言:javascript
复制
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]
    });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-17 23:50:29

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

代码语言:javascript
复制
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]
    });
}

这应该可以做到,它更像是一种“旧式-逻辑-锤子”的方法--以防你在寻找它:也许有一种更优雅的方法可以通过使用其他操作符来解决这个问题,但如果不知道完整的数据和所有的逻辑,那就很难说了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41204055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档