我有一个从服务器获取数据的通用服务。当收到响应时,我使用mapper函数将纯JSON数据映射到所需的模型。对于mapper函数中的某些类类型,我需要从服务器获得一些额外的数据。如何强制mapper函数等待第二个请求?
这是我的get功能:
getChildren(params: ITreeQueryParams): Observable<Optional<T[]>> {
params.id = isPresent(params.id) ? params.id : 0;
params.parentId = isPresent(params.parentId) ? params.parentId : 0;
params.isRoot = isPresent(params.isRoot) ? params.isRoot : false;
params.additionalId = isPresent(params.additionalId) ?
params.additionalId : 0;
return this.http.get<IListResponse<T>>
(`${this.resourceUrl}/getChildren/${params.id}/${params.parentId}/${params.isRoot}/${params.additionalId}`,
{
observe: 'response'
}).pipe(map((resp) => this.mapResponse(resp,this.model)));
}这是我的地图功能:
protected mapResponse(resp: any, model: IAsset): void {
if (resp) {
this.anotherTreeService.getNodeDetail(resp.id, resp.isRoot).subscribe(res => {
model.additionalData = {canEdit: res.length > 0 ? true : false};
});
if (resp.name) {
model.title = resp.name;
}
}
}发布于 2019-07-31 05:33:13
在RxJS中有很多运营商可以实现您想要的结果。当数据模型本身并不包含所有数据并且需要一个单独的调用来根据第一个结果检索附加数据时,您经常看到的是这样的示例:
this.myFirstService.getById(id).pipe(
map(data => jsonToMyModel(data)),
tap(model => this.data = model),
switchMap(model => {
return this.mySecondService.getListById(model.id)
}),
tap(secondData => this.data.list = secondData)
).subscribe()这改变了您正试图实现的目标,因为通过使用forkJoin()或mergeMap(),所有数据都有可能最终由可观察的人返回一个模型。这些操作符中的任何一个都有它们在这种情况下的用法。
希望这能有所帮助。一个更明确和直接的例子,你想要什么,将需要一个更完整的问题与一些例子,你想要什么,你尝试了什么。
发布于 2019-07-31 05:31:31
如果我对你的理解是正确的,你只想提出一个请求,并为它提出子请求。
为此,如果需要接受许多子请求,可以使用switchMap和forkJoin。
下面是您如何重写代码(我将编写一个简化版本)
getChildren() {
this.http.someRequest.pipe(
tap(response => {
if (resp.name) {
model.title = resp.name;
}
}),
switchMap(response =>
forkJoin(
response.map(r => this.http.someRequest(r))
)
)
)
}switchMap所做的是在每个源发射(您的第一个可观测的)之后,它订阅在回调中可观察到的返回(如果它已经订阅了,它首先从可观察的回调中取消订阅)。
forkJoin的工作方式类似于Promise.all。您可以在那里传递一个Array、Object或多个可观测值(现在已不再推荐),在订阅中,您可以获得Array或Object。
请注意,只有当所有可观测的forkJoin完成时,才会发出由每个可观测的发送的最后一个值。此外,如果任何可观察到的完成没有发射值,forkJoin也完成没有发射值。因为所有的http.whatever都是可观察的,只有一个next和直接的complete,在那之后你就不用担心了。
同样,如果有任何可观测的错误,forkJoin错误。
https://stackoverflow.com/questions/57283581
复制相似问题