Javascript 如何使用RxJS以适当的格式返回observable,并附加单独的分页数据
我有一个返回以下内容的API:Javascript 如何使用RxJS以适当的格式返回observable,并附加单独的分页数据,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,我有一个返回以下内容的API: { 'data' : { players: [ {id: 1, name: 'harry'}, {id: 2, name: 'barry'} ... ], }, 'paging': { current: 1, totalPages: 10, } } 我如何在对象中的播放器和分页信息中正确返回此值,使它们成为单独的键 getPlayers(type: string): Obser
{
'data' : {
players: [
{id: 1, name: 'harry'},
{id: 2, name: 'barry'} ...
],
},
'paging': {
current: 1,
totalPages: 10,
}
}
我如何在对象中的播放器和分页信息中正确返回此值,使它们成为单独的键
getPlayers(type: string): Observable<Player[]> {
return this.get(myApiURL).pipe(
map(result => {
'players': result.data.map(player => {
player._dead = !!player.deathDate;
return player;
}),
}
);
);
getPlayers(类型:string):可观察{
返回此.get(myapirl).pipe(
映射(结果=>{
“玩家”:result.data.map(玩家=>{
玩家。_dead=!!player.death日期;
返回球员;
}),
}
);
);
接口
interface Player {
id;
name;
}
interface Paging {
current;
totalPages
}
interface HttpPlayer {
data: {
players: Player[]
};
paging: Paging;
}
interface UiPlayer {
id;
name;
current;
totalPages;
}
映射到合并播放器和分页(关于您的问题)
映射到单独的播放器和分页(关于您的评论)
使用映射(合并)
getPlayers(类型:string):可观察{
返回此.get(myapirl).pipe(
地图(将播放器与分页合并)
)
}
使用映射(单独)
getPlayers(类型:string):可观察{
返回此.get(myapirl).pipe(
地图(mapHttpPlayerToPlayers)
)
}
getPaging(类型:string):可观察{
返回此.get(myapirl).pipe(
地图(mapHttpPlayerToPaging)
)
}
我调整了映射。这个答案解决了您的问题还是您需要进一步的信息?我不理解上述解决方案的问题。无论您的对象有多少个属性。mappinig要么使用包含所有属性的spread运算符,要么创建一个包含对象分配的对象,该对象分配也包含所有参数。您的如果你觉得有一个“更干净”的解决方案,那么也许可以提供你不舒服的地方的信息。也请集中在这里的一个问题,并考虑打开另一个问题。我更新了我的答案。“为玩家发送一个对象数组,为分页发送一个单独的对象不是更有意义吗?”你的API已经发送了这个结构。我不确定你想实现什么。我现在回答了你的问题和你的新要求(单独的对象-关于你的评论)。从现在起,我将停止更新,因为您似乎不知道您需要/想要什么。我试图帮助您,但我在该平台上花费的时间有限。
const mergePlayersWithPaging = (data: HttpPlayer): UiPlayer [] => data.players.map(player => Object.assign({}, player, data.paging))
const mapHttpPlayerToPlayers = (httpPlayer: HttpPlayer): Player[] => httpPlayer.data.players;
const mapHttpPlayerToPaging = (httpPlayer: HttpPlayer):
getPlayers(type: string): Observable<Player[]> {
return this.get(myApiURL).pipe(
map(mergePlayersWithPaging)
)
}
getPlayers(type: string): Observable<Player[]> {
return this.get(myApiURL).pipe(
map(mapHttpPlayerToPlayers)
)
}
getPaging(type: string): Observable<Player[]> {
return this.get(myApiURL).pipe(
map(mapHttpPlayerToPaging)
)
}