Angular 带数组的SwitchMap运算符
我试图学习rxjs和一般的可观察概念,有一个场景,我有一个Angular 带数组的SwitchMap运算符,angular,rxjs,observable,Angular,Rxjs,Observable,我试图学习rxjs和一般的可观察概念,有一个场景,我有一个{}类,其中{}可以以多对多关系的方式加入 在Firestore中,我收集了房间,每个房间都有一个名为players的属性,它是一个用户uids数组 创建房间组件时,我订阅\u roomService.getPlayersInRoom(roomId),如下所示: getPlayersInRoom(roomId:string){ 返回此文件。_db.doc(`rooms/${roomId}`)。valueChanges().pipe( 地图
{}
类,其中{}
可以以多对多关系的方式加入
在Firestore中,我收集了房间
,每个房间都有一个名为players
的属性,它是一个用户uid
s数组
创建房间组件时,我订阅\u roomService.getPlayersInRoom(roomId)
,如下所示:
getPlayersInRoom(roomId:string){
返回此文件。_db.doc(`rooms/${roomId}`)。valueChanges().pipe(
地图(房间=>room.players),
switchMap(players=>players),//2
开关映射(playerId=>{
if(playerId){
返回此.u db.doc(`users/${playerId}`)。valueChanges();
}
})
);
}
我稍后用
。订阅(播放器=>{
如果(球员){
this.players=新数组();
这个。玩家。推(玩家);
}
这里有两个问题。My observable未按预期返回播放器数组(请参见第//2行,该行将字符串[]转换为字符串)
另一个问题是,每次文件室更改时,我都会在我的组件中新建this.players
数组(否则.push()
将推送重复的文件)
我已经阅读了一些关于这些运算符的文档,我对它们有一些了解,但还不足以理解为什么此代码没有按应有的方式运行。首先,
switchMap
希望您返回一个可观察的值。如果它是一个类似于数组的值,它将使用from
将其转换为一个数组(请参见此)
如果您真的想在流中返回一个数组-您应该返回一个流,例如使用:switchMap(value=>of([])
但是,在您的情况下,您希望用流替换数组中的每个id。例如,我们需要使用a(名称本身就说明了)。每个玩家数组都将切换到一个新流。我们将组合valueChanges()
streams上的最新值
举个例子:
getPlayersInRoom(roomId:string){
返回此文件。_db.doc(`rooms/${roomId}`)。valueChanges().pipe(
地图(房间=>room.players),
开关地图(玩家=>{
//玩家ID的回合数组
//进入一系列变化之中
const playersStreams=players.map(
playerId=>this.\u db.doc(`users/${playerId}`).valueChanges()
);
//合并该阵列中所有流的最新更改
返回组合测试(…PlayerStreams);
})
);
}
然后在订阅中,players
将是来自valueChanges()
的组合值数组
getPlayersInRoom(5)
.订阅(玩家=>{
这个。玩家=玩家;
})
请注意,有更多的方法可以合并来自多个valueChanges()
的值。最常见的方法是:forkJoin
和zip
还有更多的方法可以解决这个问题
希望这对你有所帮助你太棒了!@ska dev,很乐意帮忙:)