【发布时间】:2020-10-13 21:50:13
【问题描述】:
问题: 当我从服务器获取数据时,我得到了一些格式的对象:
{
list: {
pagination: {},
entries: []
}
}
我需要检查条目并更改它们。要更改它们,我需要为每个条目调用一些 REST API(例如:在第一次调用中,我将获取 id,对于每个 id,我需要获取真实数据)。在为每个对象完成所有 REST 调用之后,我需要更改其数据。所以 entry[i] = 从 id 到真实数据。
我用 Promises 解决了这个问题,但我想用 Observables 解决这个问题。
我尝试使用 rxjs 中的 map 和 concatMap 但没有成功。
代码:
public getUsers(queryBody?: SearchRequest): Observable<PersonPaging> {
const searchRequest =
queryBody ||
this.searchService.makeSearchRequest(
new Query({ type: ContentModel.TYPE_PERSON })
);
return this.searchService
.search(searchRequest)
.pipe(
switchMap(async (resultSetPaging: ResultSetPaging) => {
const users: PersonPaging = {
list: {
pagination: resultSetPaging.list.pagination,
entries: []
}
};
for (const rowEntry of resultSetPaging.list.entries) {
const { properties } = rowEntry.entry;
const personEntry = await this.getUser(
properties[ContentModel.PROP_USERNAME]
).toPromise();
const person: Person = personEntry.entry;
person.avatarId = this.getUserAvatarImage(person);
users.list.entries.push(personEntry);
}
return users;
})
);
}
问题结束
代码进行中:
return this.searchService.search(searchRequest).pipe(
map((resultSetPaging: ResultSetPaging) => {
return from(resultSetPaging.list.entries).pipe(
concatMap(rowEntry => {
const { properties } = rowEntry.entry;
return from(
this.getUser(properties[ContentModel.PROP_USERNAME])
).pipe(
map(personEntry => {
const person: Person = personEntry.entry;
person.avatarId = this.getUserAvatarImage(person);
return { person };
})
);
})
);
})
);
使用此代码,我可以让所有用户获得修改后的数据,但我没有获得我想要的分页对象。它调用了 x 次(x - 用户/条目数)
【问题讨论】:
-
这个ANSWER 应该可以帮助你。它没有专门处理分页,但显示了如何从多个 http 调用返回一组组合数据。 StackBlitz Sample
标签: angular dictionary promise rxjs observable