Оператор 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 если вы хотите быть уверены, что все источники излучают хотя бы один раз).

Другие вопросы по тегам