Наблюдаемый объект наблюдаемых массивов? - PullRequest
1 голос
/ 19 апреля 2019

У меня есть документ Firestore, у которого есть два свойства, и все они являются массивами идентификаторов различных <Game>{} объектов в другом месте базы данных Firestore.объект, который содержит два отдельных массива элементов, которые представляют эти идентификаторы?

Я не думаю, что есть способ просто иметь один единственный поток объектов, потому что (как только я подпишусь), я не знаю, какой элементпринадлежал к какому массиву, так как размеры массивов не постоянны.

Я новичок в наблюдаемых и rxjs и постоянно читаю о различных операторах, но я застрял здесь и обдумываю реструктуризацию своих данных, если смогуне могу найти решение.

Прямо сейчас у меня есть что-то подобное в моем классе обслуживания, но оно не работает, как я ожидаю, когда я подпишусь на функцию.

  getPlayerGames(uid: string) {
    return this._db.doc<PlayerGameSession>(`users/${uid}/mygamesession/games`).valueChanges().pipe(
      map(gameObj => {
        let combined1;
        let combined2;

        if (gameObj.prop1) {
          const prop1Streams = gameObj.prop1.map(
            gameId => this._db.doc<Game>(`games/${gameId}`).valueChanges()
          );

          combined1 = combineLatest(...prop1Streams);
        }

        if (gameObj.prop2) {
          const prop2Streams = gameObj.prop2.map(
            gameId => this._db.doc<Game>(`games/${gameId}`).valueChanges()
          );

          combined2 = combineLatest(...prop2Streams);
        }

        return combineLatest(combined1, combined2);

      }),
      switchMap(([c1, c2]) => of({ c1: c1, c2: c2 }))
    );
  }

1 Ответ

1 голос
/ 19 апреля 2019

Вы возвращаете наблюдаемую объект с двумя свойствами из типа наблюдаемой, если вы хотите вернуть наблюдаемую объект с двумя массивами с данными, необходимыми для объединения наблюдаемых массивов, как в примере ниже:

const v1 = new BehaviorSubject('1')
const v2 = new BehaviorSubject('2')
const v3 = new BehaviorSubject('3')
const v4 = new BehaviorSubject('4')

const combined1 = combineLatest(v1, v2)
const combined2 = combineLatest(v3, v4)

const combined3 = combineLatest(combined1, combined2)

combined3
  .pipe(switchMap(([c1, c2]) => of({c1: c1, c2: c2})))
  .subscribe(console.log)

В этом примере я взял четыре наблюдаемых объединил их в два массива, а затем объединил эти массивы в объединенный объект обоих из них

Попробуйте этот код:

getPlayerGames(uid: string) {
    return this._db.doc<PlayerGameSession>(`users/${uid}/mygamesession/games`).valueChanges().pipe(
  switchMap(gameObj => {
    let combined1 = of([]);
    let combined2 = of([]);;

    if (gameObj.prop1) {
      const prop1Streams = gameObj.prop1.map(
        gameId => this._db.doc<Game>(`games/${gameId}`).valueChanges()
      );

      combined1 = combineLatest(...prop1Streams);
    }

    if (gameObj.prop2) {
      const prop2Streams = gameObj.prop2.map(
        gameId => this._db.doc<Game>(`games/${gameId}`).valueChanges()
      );

      combined2 = combineLatest(...prop2Streams);
    }

    return combineLatest(combined1, combined2)
       .pipe(switchMap(([c1, c2]) => of({c1: c1, c2: c2}))

  })
);

}

...