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



我想访问状态数据,以将结果作为新操作的属性传递。在效果触发后,我设法从状态中提取了所需的数据,但使用数据调度新操作的最后部分不起作用。我无法将两个参数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传递给新的GetInstancesAction?

编辑:

我用下面的代码实现了它。这是解决这个问题的有效方法吗?

@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}))
);

这段代码看起来很棒,是一种非常有效的方法

除非我遗漏了什么,否则我想你可以清理一下,比如:

@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。

另一个建议是创建一个新的选择器,将这两个选择器组合在一起。我知道这听起来有些过头了,但这样做会给您带来一点性能优势,因为内置了选择器结果的缓存。

不管怎样,我希望这能有所帮助。弄清楚这一点做得很好。

最新更新