进行http请求时具有多个forkjoin的rxjs
rxjs with multiple forkjoin when doing http requests
我正在做一些 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 (member/reports) + 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]
});
}
您可以使用 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]
});
}
应该这样做,它更像是一种 "old-style-logic-hammer" 方法 - 如果您正在寻找它:可能有更优雅的方法来解决这个问题使用其他运算符,但在不知道完整数据和所有逻辑的情况下很难说。
我正在做一些 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 (member/reports) + 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]
});
}
您可以使用 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]
});
}
应该这样做,它更像是一种 "old-style-logic-hammer" 方法 - 如果您正在寻找它:可能有更优雅的方法来解决这个问题使用其他运算符,但在不知道完整数据和所有逻辑的情况下很难说。