Эффект NgRx прослушивает только последние возвращенные наблюдаемые, игнорирует любые предыдущие возвращаемые наблюдаемые - PullRequest
1 голос
/ 09 октября 2019

Я синхронизирую свое приложение с firestore, прислушиваясь к изменениям. Когда приложение запускается, оно сразу отправляет пару действий в мой магазин, чтобы добавить документы. У меня также есть эффект NgRx, ожидающий запуска действия add для выполнения некоторого кода, в основном, выборки двух других документов из ссылок на документ, отправленный с действием. Я возвращаю forkJoin, и эффект только завершает последнюю возвращаемую наблюдаемую, игнорируя все прошлые.

Я уже пробовал многие операторы RxJs отсеивать, объединять и т. Д., Но он имеет тот же результат.

Служба, отвечающая за синхронизацию документов

fStore.collection<ReservationDocument>('reservations', query =>
            query.where('hotel', '==', hotel.ref)
          )
          .stateChanges()
          .subscribe(actions => {
            actions.forEach(action => {
              switch (action.type) {
                case 'added':
                  console.log(action.payload);
                  store.dispatch(AddReservation({ reservation: action.payload }));
                  break;
                case 'modified':
                  store.dispatch(ModifiyReservation({ reservation: action.payload }));
                  break;
                case 'removed':
                  store.dispatch(RemoveReservation({ reservation: action.payload }));
                  break;
              }
            });
          });

И эффект

getClientAndHotel$ = createEffect(() =>
    this.actions$.pipe(
      ofType(ADD_RESERVATION),
      switchMap(
        (addReservation: {
          reservation: DocumentChange<ReservationDocument>;
        }) => {
          console.log('hello');
          return forkJoin([
            (addReservation.reservation.doc.get(
              'client'
            ) as DocumentReference).get(),
            (addReservation.reservation.doc.get(
              'hotel'
            ) as DocumentReference).get()
          ]).pipe(
            map(
              result => {
                console.log(addReservation.reservation.doc.ref.path);
                return {
                  type: UPDATE_RESERVATION,
                  client: ClientFromDocumentData(
                    result[0].data() as ClientDocument,
                    result[0].ref
                  ),
                  hotel: HotelFromDocumentData(
                    result[1].data() as HotelDocument,
                    result[1].ref
                  ),
                  reservation: addReservation.reservation
                };
              }
            )
          );
        }
      )
    )
  );

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

1 Ответ

1 голос
/ 09 октября 2019

Как отмечается в комментарии к этому вопросу, вы должны использовать mergeMap вместо switchMap.

switchMap отменит отложенный запрос, в то время как mergeMap обработает все запросы. Если порядок запросов имеет значение, используйте concatMap.

https://rxjs -dev.firebaseapp.com / api / operator / mergeMap

https://rxjs -dev.firebaseapp.com / api / operator / switchMap

https://rxjs -dev.firebaseapp.com / api / operator / concatMap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...