Условно возвратные действия в эффекте NgRx - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь проверить условие в действии и отправить различные действия в зависимости от результата условия.Условные параметры получены из Store и вызова API, как показано ниже.

@Effect()
// error here - Observable<void> is not assignable to type Observable<Action>
  loadUserSkills$: Observable<Action> = this.actions$
    .ofType(UserActionTypes.REQUEST_USER_SKILLS)
    .withLatestFrom(this.store$)
    .map(([action, storeState]) => {
      this.skillsService.getUserSkillsCacheVersion().
        map((cacheVersion) => {
          if (cacheVersion === storeState.users.cacheVersion.userSkills) {
            return new UsersActions.RequestUserSkillsFromStore();
          } else {
            return new UsersActions.RequestUserSkillsFromServer();
          }
        });
      });

Что здесь не так?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы не возвращаетесь внутрь своей карты.

return this.skillsService...

Так что машинопись думает, что это пустота

0 голосов
/ 19 февраля 2019

Я исправил это, слегка изменив эффект, и ForkJoined к наблюдаемому, как показано ниже.

  @Effect()
  loadUserSkills$: Observable<Action> = this.actions$
    .ofType(UserActionTypes.REQUEST_USER_SKILLS)
    .withLatestFrom(this.store$)
    .map(([, storeState]) => storeState.users.cacheVersion.userSkills)
    .switchMap((currentCacheVersion) =>
      forkJoin([of(currentCacheVersion), this.skillsService.getUserSkillsCacheVersion()]))
    .map((data: any) => {
      const [currentCacheVersion, latestCacheVersion] = data;
      if (latestCacheVersion !== 0 && currentCacheVersion === latestCacheVersion) {
        return new UsersActions.RequestUserSkillsFromStore();
      } else {
        return new UsersActions.RequestUserSkillsFromServer();
      }
    });
0 голосов
/ 19 февраля 2019

Я бы попробовал это, не объявляя тип для loadUserSkills $. Я никогда не видел, чтобы кто-нибудь объявлял тип там.Кроме того, новый стандарт заключается не в точечной цепи, а в использовании.

    this.actons$.pipe(ofType(...),withLatestFrom(...),...

Включили ли вы свой магазин в конструктор класса?

    constructor(private store$: AppState, private actions$: Action) 

также обычно вы используете селектор для выбора частей состояния в ваших эффектах, а не для прямого доступа к ним.как это.Посмотрите на селекторы NGRX.

    this.store$.pipe(select(selectUserSkills)) 

но вам нужно будет установить селектор с именем selectUserSkills

Также, если ваш this.skillsService.getUserSkillsCacheVersion () возвращает Observable, вам нужно подписаться на него, чтобы что-нибудь произошло.

Я думаю, здесь нужна дополнительная информация.Пожалуйста, оставьте больше кода.Эта ошибка возникает во время выполнения или компиляции?

...