Javascript RXJS Observables-每个索引值和合并结果的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

我通过一个http调用获得一个带有objs的数组。现在我想为每个返回ID的obj调用另一个http调用。毕竟,我想要一个可观察的结果

到目前为止,我设法为每个索引获得一个http调用。问题不是一个结果,而是多个结果

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()

所以基本上你想要实现的就是这个

  • 获取氏族信息
  • 使用步骤1中的氏族信息,获取氏族中的
    成员列表
  • 对于
    成员列表中的每个成员
    ,获取玩家
  • 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)[未定义,未定义,未定义,未定义,未定义,未定义,未定义,未定义,未定义,未定义,…]