Я синхронизирую свое приложение с 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 выполнит для завершения и отправки действия, независимо от того, сколько разэффект сработал, только последний триггер отправит действие. Я подозреваю, что она просто перезаписывает подписку каждый раз, когда срабатывает эффект, не дожидаясь завершения предыдущей, но я не знаю, как решить эту проблему.