Объединение наблюдаемых результатов в один массив - PullRequest
1 голос
/ 10 апреля 2020

Мне нужно сделать два вызова Firebase (так как он не поддерживает запросы OR) и объединить вывод в один массив в конце, чтобы вернуться к вызывающей службе.

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

getAllFriends(): Observable<[Friendship[], Friendship[]]> {

    const invitesSent = from(this.afAuth.currentUser.then(user => {
      return user.uid;
    }))
    .pipe(
      switchMap(
          userid => {
          return this.db.collection('friendships', ref => ref.where('inviter', '==', userid)).snapshotChanges().pipe(map(actions => {
            return actions.map(action => {
              const data = new Friendship(action.payload.doc.data());
              data.id = action.payload.doc.id;
              console.log(data);
              return data;
            });
          }));
        }
      )
    );

    const invitesReceived = from(this.afAuth.currentUser.then(user => {
      return user.uid;
    }))
    .pipe(
      switchMap(
          userid => {
          return this.db.collection('friendships', ref => ref.where('invitee', '==', userid)).snapshotChanges().pipe(map(actions => {
            return actions.map(action => {
              const data = new Friendship(action.payload.doc.data());
              data.id = action.payload.doc.id;
              console.log(data);
              return data;
            });
          }));
        }
      )
    );
    return combineLatest([invitesSent, invitesReceived]);
  }

Friendship - это просто объект со свойствами: пары значений, ничего особенного.

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

1 Ответ

2 голосов
/ 10 апреля 2020

Как насчет возврата, в конце, что-то вроде этого

return combineLatest([invitesSent, invitesReceived]).pipe(
   map(([frienships_1, friendships_2]) => ([...friedships_1, ...friendships_2]))
)
...