在 RxJS 管道中多次调用 http.get
Calling http.get multiple times in a RxJS pipeline
我需要在唯一的 RxJS 管道中多次处理 http.get
响应。这是 JSON 响应的一部分:
[
{
"id": 1,
"layerName": "Primary",
"hierarchyCount": 2,
"layerHierarchies": [
{
"hierarchyOrder": 1,
"id": 3,
"name": "Secant Piles"
},
{
"hierarchyOrder": 2,
"id": 6,
"name": "As-Designed"
}
],
"gisViewTypeId": "M1",
"coordinateSystemId": 5,
"verticalCoordinateSystemId": 7,
"measurementUnitSymbol": null,
"color": "#fabed4",
"stroke": true,
"weight": 3,
"opacity": 1,
"fill": true,
"fillColor": "#f032e6",
"fillOpacity": 0.2,
"active": false,
"pointTypeId": 2,
"shiftX": 0,
"shiftY": 0
},
...
]
通过以下管道,我得到 hierarchyCount
的最大值如下:
this.layerHierarchi$ = this.http.get<LayerHierarchiesEntity[]>(baseURL + "Structure/StructureHierarchy", { params: layerParams, headers: headers })
return this.layerHierarchi$.pipe(
mergeMap((value) => from(value)),
pluck("hierarchyCount"),
max(),
// mergeMap(maxHierarchyCount => this.layerHierarchi$),
)
如您所见,在注释的管道的最后一行中,我尝试获取原始 http.get
响应以继续处理。
我不确定在 mergeMap
运算符中进行另一个调用是否正确,或者是否有另一种技术或 RxJS 运算符来处理这个问题?换句话说,我需要在整个管道中多次使用原始响应。
如果我对问题的理解正确,我会按照这些思路考虑解决方案。内嵌评论
this.layerHierarchi$ = this.http.get<LayerHierarchiesEntity[]>(baseURL + "Structure/StructureHierarchy", { params: layerParams, headers: headers })
return this.layerHierarchi$.pipe(
// process the result of the http call and extract within the function passed to mergeMap
// you should use the map operator
map((value) => {
// the following map is the array method, NOT the map rxjs operator
hierCounts = value.map(v => v.hierarchyCount);
hierMax = Math.max(...hierCounts) // assume hierarchyCount is a number
return [value, hierMax]
}),
mergeMap(([value, hierMax]) => // do what you need to do to continue processing),
)
一些额外的注意事项。
您一直在使用 mergeMap
运算符向其传递一个函数,该函数 returns 由 from
rxjs 函数创建的 Observable,您向其传递了一个数组。
除非你有充分的理由这样做,否则我更愿意像我的示例一样使用 javascript 数组函数处理数组。
如果在进一步处理过程中需要执行其他级联 http 调用,请考虑使用 concatMap
而不是 mergeMap
。您可能会从 rxjs 与 http in this article.
的典型使用模式中找到一些灵感
我需要在唯一的 RxJS 管道中多次处理 http.get
响应。这是 JSON 响应的一部分:
[
{
"id": 1,
"layerName": "Primary",
"hierarchyCount": 2,
"layerHierarchies": [
{
"hierarchyOrder": 1,
"id": 3,
"name": "Secant Piles"
},
{
"hierarchyOrder": 2,
"id": 6,
"name": "As-Designed"
}
],
"gisViewTypeId": "M1",
"coordinateSystemId": 5,
"verticalCoordinateSystemId": 7,
"measurementUnitSymbol": null,
"color": "#fabed4",
"stroke": true,
"weight": 3,
"opacity": 1,
"fill": true,
"fillColor": "#f032e6",
"fillOpacity": 0.2,
"active": false,
"pointTypeId": 2,
"shiftX": 0,
"shiftY": 0
},
...
]
通过以下管道,我得到 hierarchyCount
的最大值如下:
this.layerHierarchi$ = this.http.get<LayerHierarchiesEntity[]>(baseURL + "Structure/StructureHierarchy", { params: layerParams, headers: headers })
return this.layerHierarchi$.pipe(
mergeMap((value) => from(value)),
pluck("hierarchyCount"),
max(),
// mergeMap(maxHierarchyCount => this.layerHierarchi$),
)
如您所见,在注释的管道的最后一行中,我尝试获取原始 http.get
响应以继续处理。
我不确定在 mergeMap
运算符中进行另一个调用是否正确,或者是否有另一种技术或 RxJS 运算符来处理这个问题?换句话说,我需要在整个管道中多次使用原始响应。
如果我对问题的理解正确,我会按照这些思路考虑解决方案。内嵌评论
this.layerHierarchi$ = this.http.get<LayerHierarchiesEntity[]>(baseURL + "Structure/StructureHierarchy", { params: layerParams, headers: headers })
return this.layerHierarchi$.pipe(
// process the result of the http call and extract within the function passed to mergeMap
// you should use the map operator
map((value) => {
// the following map is the array method, NOT the map rxjs operator
hierCounts = value.map(v => v.hierarchyCount);
hierMax = Math.max(...hierCounts) // assume hierarchyCount is a number
return [value, hierMax]
}),
mergeMap(([value, hierMax]) => // do what you need to do to continue processing),
)
一些额外的注意事项。
您一直在使用 mergeMap
运算符向其传递一个函数,该函数 returns 由 from
rxjs 函数创建的 Observable,您向其传递了一个数组。
除非你有充分的理由这样做,否则我更愿意像我的示例一样使用 javascript 数组函数处理数组。
如果在进一步处理过程中需要执行其他级联 http 调用,请考虑使用 concatMap
而不是 mergeMap
。您可能会从 rxjs 与 http in this article.