В моем проекте Angular у меня есть эффект ngrx, который запускает новое действие SearchAction:
createSearchWithNewLimit$ = createEffect(() => {
return this.actions$.pipe(
ofType(pageLimitChangedAction),
concatLatestFrom(() => [this.store.select(selectSearchParams)]),
switchMap(([{limit}, currSearchParams]) => {
if (currSearchParams) {
const searchParams = { ...currSearchParams, limit};
return of(searchAction({searchParams}));
}
return EMPTY;
})
)
})
Кроме того, редуктор SearchAction обновляет searchParams в состоянии (тот, который извлекается в этом эффекте в this.store.select(selectSearchParams)).
Означает ли это, что каждый раз при отправке SearchAction этот эффект будет срабатывать, поскольку он использует this.store.select(selectSearchParams)? и если да, то как это не вызовет бесконечный цикл? Или оно оценивается только один раз? Спасибо





concatLatestFrom считывает текущее значение из хранилища и передает это значение следующему оператору. Эффект не будет перезапускать эффект при изменении его значения.
Его можно сравнить с оператором withLatestFrom в RxJS, с той разницей, что concatLatestFrom вычисляется лениво.
Для получения дополнительной информации см. документы:
Примечание. Из соображений производительности используйте оператор выравнивания, например concatLatestFrom, чтобы предотвратить срабатывание селектора до тех пор, пока не будет отправлено правильное действие.
Спасибо, вы помогли мне решить ошибку, над которой я застрял несколько дней.
Нет, это не
combineLatest.concatLatestFrom— это специальный оператор из ngrx ngrx.io/api/operators/concatLatestFrom, и он просто «прикрепит» последнее значение наблюдаемого к основному потоку, но не будет повторно запускать основной поток, если это позволит смысл.