SimonBarker
SimonBarker

Reputation: 1424

Combining observable outputs in to one array

I need to make two calls to Firebase (as it doesn't support OR queries) and merge the output into one array at the end to return to the calling service.

I have something that gets pretty close but it outputs a 2D array of arrays (one for each call to Firebase). I've tried a few things and this is the best I can get to. Any help on tidying up the below would be great.

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 is just an object with property: value pairs, nothing special.

I have tried then putting a .pipe() after this returned observable but that just stops the subscription firing in the calling service.

Upvotes: 1

Views: 76

Answers (1)

Picci
Picci

Reputation: 17762

What about returning, at the end, something like this

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

Upvotes: 2

Related Questions