有条件地返回NgRx效果中的动作

问题描述 投票:0回答:3

我正在尝试检查效果中的条件并根据条件结果发送不同的操作。条件参数从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();
          }
        });
      });

这里有什么不正确的?

angular rxjs ngrx ngrx-effects
3个回答
0
投票

我会尝试这个而不声明loadUserSkills的类型$我从未见过有人在那里声明类型。新的标准也不是点链而是使用。

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

您是否在商店的构造函数中包含了商店?

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

通常也会使用选择器来选择效果中的状态片段,而不是像这样直接访问它们。查看NGRX选择器。

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

但你必须设置一个名为selectUserSkills的选择器

此外,如果您的this.skillsService.getUserSkillsCacheVersion()返回一个Observable,您需要订阅它以发生任何事情。

我想这里需要更多信息。请发布更多代码。在运行时或编译时发生此错误吗?


0
投票

你没有在地图内返回。

return this.skillsService...

因此打字稿认为这是一个空白


0
投票

我通过稍微修改效果来修复它,并将Fork加入如下所示的observable。

  @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();
      }
    });
© www.soinside.com 2019 - 2024. All rights reserved.