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