Я пытаюсь изучить rxjs и концепцию Observable в целом, и у меня есть сценарий, в котором у меня есть класс <Room>{}
, где <Player>{}
может присоединяться в стиле отношений «многие ко многим».
В Firestore у меня есть коллекция rooms
, где у каждой комнаты есть свойство с именем players
, которое представляет собой массив пользователей uid
s.
Когда создается компонент комнат, я подписываюсь на _roomService.getPlayersInRoom(roomId)
, который выглядит следующим образом:
getPlayersInRoom(roomId: string) {
return this._db.doc<Room>(`rooms/${roomId}`).valueChanges().pipe(
map(room => room.players),
switchMap(players => players),//2
switchMap(playerId => {
if(playerId) {
return this._db.doc<Player>(`users/${playerId}`).valueChanges();
}
})
);
}
Я подпишусь на это позже с
.subscribe(player => {
if (player) {
this.players = new Array();
this.players.push(player);
}
Здесь есть пара проблем. Моя наблюдаемая не возвращает массив игроков, как ожидалось (см. Строку // 2, которая преобразует строку [] в строку)
Другая проблема заключается в том, что я обновляю массив this.players
в своем компоненте каждый раз, когда эта комната изменяется (в противном случае .push()
будет вставлять дубликаты.
Я читал документацию по некоторым из этих операторов, и я понимаю их отчасти, но недостаточно, чтобы понять, почему этот код ведет себя не так, как должен.