在 angular7 中,如何从 2 个不同的依赖 http 调用中获得组合响应。第一个 http 调用 returns 对象数组及其相关数据
In angular7, how to get combined response from 2 different dependent http call. first http call returns an array of object and other its related data
我的第一个apireturns关注数据
{
"resp": [
{
"id": "932e",
"name": "jon"
},
{
"id": ...
"name": ..,
}
]
}
我必须遍历这个数组并使用上面的 id 再次调用 API,returns 数据是这样的
{
"posts": [
{
"id": "1111",
"title": "post on facebook"
},
{
"id": "2222",
"title": "post on covid"
}
]
决赛
数据应采用这种格式
{
"resp": [
{
"id": "932e",
"name": "jon",
"posts": [
{
"id": "1111",
"name": "post on facebook"
},
{
"id": "2222",
"name": "post on covid"
}
]
}
]
}
像这样调用第二个 api 的方法签名
public getUsersPost(userId) {
return this.datasetService.getPosts(userId).pipe(
map(ds => {
return ds.posts
}));
}
不确定如何为 >
使用 map、mergreMap 或 concatMap
提前致谢
您选择的映射运算符取决于您想要的加载策略。 mergeMap
并行发送所有请求(您可以限制同时请求的最大数量),而 concatMap
将串行执行它们。我还建议将第一个数组拆分成它的组成部分。
我怀疑你想要这样的东西:
const populatedUsers$ = this.getUsers.pipe(
mergeMap(userArray => from(userArray)), // now emitting each user separately)
mergeMap(user => this.getUsersPost(user.id).pipe(
map(ds => ({ ...user, posts: ds.posts }))
), null, 5), // maximum of 5 concurrent requests
toArray() // convert everything back to a single array
);
我的第一个apireturns关注数据
{
"resp": [
{
"id": "932e",
"name": "jon"
},
{
"id": ...
"name": ..,
}
]
}
我必须遍历这个数组并使用上面的 id 再次调用 API,returns 数据是这样的
{
"posts": [
{
"id": "1111",
"title": "post on facebook"
},
{
"id": "2222",
"title": "post on covid"
}
]
决赛 数据应采用这种格式
{
"resp": [
{
"id": "932e",
"name": "jon",
"posts": [
{
"id": "1111",
"name": "post on facebook"
},
{
"id": "2222",
"name": "post on covid"
}
]
}
]
}
像这样调用第二个 api 的方法签名
public getUsersPost(userId) {
return this.datasetService.getPosts(userId).pipe(
map(ds => {
return ds.posts
}));
}
不确定如何为 >
使用 map、mergreMap 或 concatMap提前致谢
您选择的映射运算符取决于您想要的加载策略。 mergeMap
并行发送所有请求(您可以限制同时请求的最大数量),而 concatMap
将串行执行它们。我还建议将第一个数组拆分成它的组成部分。
我怀疑你想要这样的东西:
const populatedUsers$ = this.getUsers.pipe(
mergeMap(userArray => from(userArray)), // now emitting each user separately)
mergeMap(user => this.getUsersPost(user.id).pipe(
map(ds => ({ ...user, posts: ds.posts }))
), null, 5), // maximum of 5 concurrent requests
toArray() // convert everything back to a single array
);