Оператор withLatestFrom не устанавливает нулевое значение - PullRequest
0 голосов
/ 15 октября 2018

В проекте 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 есть нулевое значение?

1 Ответ

0 голосов
/ 15 октября 2018

Похоже, вы хотите использовать combineLatest.

withLatestFrom не игнорирует null.Это обычное значение.Однако withLatestFrom реагирует только на выбросы из своего прямого источника.Это из this.actions$.pipe(ofType(HANDLE_USER_DATA)).Он также сохраняет выбросы из других источников, но сохраняет их только в своем внутреннем буфере и не реагирует на них.

С другой стороны, combineLatest будет излучать каждый выброс из каждого источника, наблюдаемого после того, как все онииспустить хотя бы один элемент (посмотрите на startWith, если хотите убедиться, что все источники испускают хотя бы один раз).

...