在rxjs效果中将数据从状态传递到新操作

时间:2020-05-11 20:36:33

标签: typescript rxjs ngrx

我想访问状态数据以将结果作为新动作的属性传递。触发效果后,我设法从状态中提取了所需的数据,但是使用数据分派新操作的最后一部分不起作用。我无法在代码的最后一行中将两个参数activeUseractiveTask传递给of(GetInstances({activeUser, activeTask}))部分。

@Effect()
updateInstanceLabelSuccess$ = this._actions$.pipe(
  ofType<Action>(EInstanceActions.UpdateInstanceLabelSuccess),
  concatMap(action => of(action).pipe(
    withLatestFrom(combineLatest(
      [this._userStore.pipe(select(selectActiveUser)),
        this._userStore.pipe(select(selectActiveTask))]
    ))
  )),
  tap(([action, [activeUser, activeTask]]: [Action, [User, Task]]) => {
    console.log(activeUser, activeTask);
    // activeUer and activeTask successfully loaded
    // pass activeUser + activeTask to props of Action GetInstances
  }),
  // activeUser and activeTask can´t be passed to new GetInstances Action
  switchMap(([action, [activeUser, activeTask]]: [Action, [User, Task]]) => of(GetInstances({activeUser, activeTask})))
);

如何将两个参数activeUseractiveTask传递给新的GetInstances动作?

编辑:

我通过以下代码使用它。这是解决这个问题的有效方法吗?

@Effect()
updateInstanceLabelSuccess$ = this._actions$.pipe(
  ofType<Action>(EInstanceActions.UpdateInstanceLabelSuccess),
  concatMap(action => of(action).pipe(
    withLatestFrom(combineLatest(
      [this._userStore.pipe(select(selectActiveUser)),
      this._userStore.pipe(select(selectActiveTask))]
    ))
  )),
  map(([action, [activeUser, activeTask]]: [Action, [User, Task]]) => GetInstances({userID: activeUser.id, taskID: activeTask.id}))
);

1 个答案:

答案 0 :(得分:1)

该代码看起来不错,并且是一种完全有效的方法。

除非我丢失了某些东西,否则我认为您可以清理以下内容:

@Effect()
updateInstanceLabelSuccess$ = this._actions$.pipe(
    ofType<Action>(EInstanceActions.UpdateInstanceLabelSuccess),
    withLatestFrom(
        this._userStore.pipe(select(selectActiveUser)),
        this._userStore.pipe(select(selectActiveTask)),
        (action, activeUser, activeTask) => [activeUser, activeTask]
    ),
    map(([activeUser, activeTask]): [User, Task]) => GetInstances({userID: activeUser.id, taskID: activeTask.id}))
);

我在这里所做的所有事情都是利用withLatestFrom的重载,包括最终的投影功能,在您不想携带无关的Action的这些情况下,我发现它们很有用。

另一个建议是创建一个新的选择器,将您拥有的那两个结合起来。我知道这听起来有些矫kill过正,但由于内置了选择器结果的缓存,因此这样做会给您带来很小的性能优势。

无论如何,我希望能有所帮助。搞清楚这一点很不错。