我有一个返回包含对象集合的Observable的服务。最初的Web调用返回一个集合,但是在项目集合内,我需要进行补充调用以检索一些额外的数据。结果应该是使用两个响应生成的新对象。
代码看起来像这样:
let result: Array<InvitationModel> = new Array<InvitationModel>();
this.apiService.getInvitations().map((invitations : Array<InvitationResponse>) => {
invitations.forEach(inv => {
this.apiService.getInvitationData(inv).map((data: DataResponse) => {
result.push(new InvitationModel(inv, data));
});
});
return result;
这是行不通的,据我了解,但我不确定编写方法的正确性,因此一旦循环完成,我只能返回结果。
任何建议将不胜感激。
答案 0 :(得分:3)
您正在寻找的是Rxjs.Observable.switchMap方法(https://www.learnrxjs.io/operators/transformation/switchmap.html)。使用此方法,您将等待,直到switchmap块中的所有可观测值都得到解析(基本上切换到新的可观测值)。另外,由于可观察部分是异步执行的,因此结果数组的方法也将不起作用,这意味着您应该从函数中返回一个可观察对象并在外部订阅以获取数据
您的示例可能如下所示:
return this.apiService.getInvitations().switchMap((invitations: Array<InvitationResponse>) => {
let result: Array<InvitationModel> = new Array<InvitationModel>();
return Observable.forkJoin(...invitations.map(inv => {
this.apiService.getInvitationData(inv).map((data: DataResponse) => {
result.push(new InvitationModel(inv, data));
});
})).map(() => {
return result;
});
});
快速说明:
就像我上面对.switchMap
所说的那样,您正在等到孩子的可观现象得到解决
使用invitations.map(inv => {
,您可以为子操作创建一个带有可观察值的数组。
使用Observable.forkJoin(
,您可以将阵列中的所有可观测对象合并为一个要等待的对象。