Javascript RXJS Observables-每个索引值和合并结果的http调用
我通过一个http调用获得一个带有objs的数组。现在我想为每个返回ID的obj调用另一个http调用。毕竟,我想要一个可观察的结果 到目前为止,我设法为每个索引获得一个http调用。问题不是一个结果,而是多个结果Javascript RXJS Observables-每个索引值和合并结果的http调用,javascript,angular,asynchronous,rxjs,observable,Javascript,Angular,Asynchronous,Rxjs,Observable,我通过一个http调用获得一个带有objs的数组。现在我想为每个返回ID的obj调用另一个http调用。毕竟,我想要一个可观察的结果 到目前为止,我设法为每个索引获得一个http调用。问题不是一个结果,而是多个结果 getStats(tag: string) { return this.service.getClanByClanTag(tag) .map(clan => { return clan.memberList; //the arr
getStats(tag: string) {
return this.service.getClanByClanTag(tag)
.map(clan => {
return clan.memberList; //the arr that return the ID's
})
.switchMap((member: PlayerByMemberListType[]) => {
return member; // singleObj of the arr
})
.concatMap((singleMember) => {
return this.service.getPlayerData(singleMember.tag).map(player => {
//push data to the new arr which should return only one time
this.newArr.push({
tag: singleMember.tag,
name: singleMember.name,
warStars: player.warStars,
trophiesNightBase: singleMember.versusTrophies
});
return this.newArr;
});
});
}
这是控制台在订阅后打印的内容:
Array [ {…} ]
Array [ {…}, {…} ]
Array(3) [ {…}, {…}, {…} ]
Array(4) [ {…}, {…}, {…}, {…} ]
Array(5) [ {…}, {…}, {…}, {…}, {…} ]
...
我知道我需要某种可观察的
。forkJoin
,但我不知道如何将其集成到代码中。尝试以下方法:
this.service.getclanbyclandag(标记)
.mergeMap(clan=>clan.memberList)
.合并地图(
member=>this.service.getPlayerData(member.tag),//假设它返回一个可观察的
(成员、玩家)=>({
tag:member.tag,
name:member.name,
战星:玩家,战星,
trophiesNightBase:member.versusTrophies
})
)
.toArray()
所以基本上你想要实现的就是这个
成员列表
成员列表中的每个成员
,获取玩家step3
中的switchMap
之前,您需要考虑一种方法来保存step2
中的信息。通常我们会使用主题
,但如果您不想,只需映射
可观察的即可保存数据:
getStats(tag: string) {
return this.service.getClanByClanTag(tag)
.map(clan => {
return clan.memberList; //the arr that return the ID's
})
.switchMap((memberList: PlayerByMemberListType[]) => {
//note that the following map is a function of javascript array, not Observable
//it returns an array
let arrayOfObservables = memberList.map(singleMember => {
this.service.getPlayerData(singleMember.tag)
//map the data so as to preserve the data of singleMember
//by creating a new object, using Object.assign
.map(playerData => {
return Object.assign({memberData: singleMember}, playerData,)
});
})
return Observable.forkJoin(arrayOfObservables);
})
.map(players => {
//players is an array of Object that is the format of {memberData:singleMember, playerData:player)
//perform Object destructuring method
return players.map(({memberData,playerData}) => {
return {
tag: memberData.tag,
name: memberData.name,
warStars: playerData.warStars,
trophiesNightBase: memberData.versusTrophies
}
})
})
}
尝试使用另一个
concatMap
而不是map使用另一个concatMap我得到了近2500个OBJ,而不是49个OBJ的arr:'Ddid您在第一个地图上使用它了吗(.map(clan=>{…)
?首先,请参阅感谢您对方法的详细描述,但smthng在这里不起作用,我收到一个错误“您在预期流的位置提供了“未定义”。您可以提供可观察、承诺、数组或可观察的。”arrayOfObservables打印出我:数组(49)[未定义,未定义,未定义,未定义,未定义,未定义,未定义,未定义,未定义,未定义,…]