Оператор withLatestFrom не устанавливает нулевое значение
В угловом проекте с использованием @ngrx/effect
у нас есть наблюдаемый поток, используя withLatestFrom
оператор rxjs.
Вот наш наблюдаемый поток эффектов:
@Effect()
handleUsersData$ = this.actions$
.pipe(
ofType(HANDLE_USER_DATA),
withLatestFrom(
this.store.pipe(select(getCurrentUserId)),
this.store.pipe(select(getUserEntities)),
),
tap(([action, currentUserId, users]) => console.log(([action, currentUserId, users]))),
switchMap(([action, currentUserId, users]) => {
const dispatchedActions: Action[] = [];
if (currentUserId) {
dispatchedActions.push(new SetCurrentUser());
} else {
dispatchedActions.push(new SomeAction());
dispatchedActions.push(new ClearUsers());
}
return dispatchedActions;
})
);
Один из используемых нами селекторов:
export const getCurrentUserId = createSelector(
getUserEntities,
getRouterStateUrl,
(users: Dictionary<User>, router: RouterStateUrl) => {
return router.params && users[router.params.userId] || null;
}
);
когда userId
определяется, действия отправляются правильно. console.log
отображает идентификатор пользователя и сущности пользователей.
Но если userId
отсутствует среди параметров маршрутизатора, селектор возвращает null
и наблюдаемый поток никогда не тикает. console.log
в tap
ничего не возвращает`
Почему withLatestFrom
кажется игнорировать null
значение и просто не отметьте, если это значение является результатом выбора? Это действительное значение в нашем контексте.
Как убедиться, что наблюдаемый поток тикает, даже если в NULL есть нулевое значение getCurrentUserId
селектор?
1 ответ
Похоже, вы хотите использовать combineLatest
вместо.
withLatestFrom
не игнорирует null
, Это обычное значение. Тем не мение, withLatestFrom
реагирует только на выбросы из своего прямого источника. Это из this.actions$.pipe(ofType(HANDLE_USER_DATA))
, Он также сохраняет выбросы из других источников, но сохраняет их в своем внутреннем буфере и не реагирует на них.
С другой стороны combineLatest
будет излучать при каждом излучении из каждого источника, наблюдаемого после того, как все они излучают хотя бы один элемент (посмотрите на startWith
если вы хотите быть уверены, что все источники излучают хотя бы один раз).