forkJoin 取决于 Angular 中的另一个响应
forkJoin depending on another response in Angular
我有一个 switchMap
,然后是一个 forkJoin
,但是其中一个调用依赖于另一个调用
this.route.paramMap
.pipe(
switchMap((params) => {
let id = parseInt(params.get('id'));
return forkJoin({
tableDataDetail: this.tblService.getTableDataDetail(id),
comboDetails: this.tblService.getUserComboDetails(// the id from the response of tableDataDetail),
});
})
)
.subscribe(
({ tableDataDetail, comboDetails }) => {
this.data = tableDataDetail;
this.comboDetails = comboDetails;
}
)
如您所见,我需要作为 getUserComboDetails() 服务的参数,一个来自另一个服务(即 tableDetailId)的响应的字段。我怎样才能用这种方式做到这一点?
如果一个 obs 需要另一个 obs 的值,您需要再次使用 switchMap
this.route.paramMap
.pipe(
switchMap(params => {
let id = parseInt(params.get("id"));
return this.tblService.getTableDataDetail(id).pipe(
switchMap(tableDataDetail => {
return this.tblService
.getUserComboDetails(tableDataDetail.id)
.pipe(
map(details => ({
tableDataDetail: tableDataDetail,
comboDetails: details
}))
);
})
);
})
)
注意:您可以在地图中,而不是return一个对象return一个数组
this.route.paramMap.pipe(
...
map(details=>([tableDataDetail,details]
)
)
}
)
}))
所以,您可以在订阅时使用 destructuring
....subscribe(res=>{
[this.data,this.comboDetails]=res;
})
Update 我做了 a stackblitz 并更正了语法错误 - 缺少一些 {
或 )
我有一个 switchMap
,然后是一个 forkJoin
,但是其中一个调用依赖于另一个调用
this.route.paramMap
.pipe(
switchMap((params) => {
let id = parseInt(params.get('id'));
return forkJoin({
tableDataDetail: this.tblService.getTableDataDetail(id),
comboDetails: this.tblService.getUserComboDetails(// the id from the response of tableDataDetail),
});
})
)
.subscribe(
({ tableDataDetail, comboDetails }) => {
this.data = tableDataDetail;
this.comboDetails = comboDetails;
}
)
如您所见,我需要作为 getUserComboDetails() 服务的参数,一个来自另一个服务(即 tableDetailId)的响应的字段。我怎样才能用这种方式做到这一点?
如果一个 obs 需要另一个 obs 的值,您需要再次使用 switchMap
this.route.paramMap
.pipe(
switchMap(params => {
let id = parseInt(params.get("id"));
return this.tblService.getTableDataDetail(id).pipe(
switchMap(tableDataDetail => {
return this.tblService
.getUserComboDetails(tableDataDetail.id)
.pipe(
map(details => ({
tableDataDetail: tableDataDetail,
comboDetails: details
}))
);
})
);
})
)
注意:您可以在地图中,而不是return一个对象return一个数组
this.route.paramMap.pipe(
...
map(details=>([tableDataDetail,details]
)
)
}
)
}))
所以,您可以在订阅时使用 destructuring
....subscribe(res=>{
[this.data,this.comboDetails]=res;
})
Update 我做了 a stackblitz 并更正了语法错误 - 缺少一些 {
或 )