Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 带数组的SwitchMap运算符_Angular_Rxjs_Observable - Fatal编程技术网

Angular 带数组的SwitchMap运算符

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( 地图

我试图学习rxjs和一般的可观察概念,有一个场景,我有一个
{}
类,其中
{}
可以以多对多关系的方式加入

在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,很乐意帮忙:)