在另一个动作的效果完成后调度其成功动作后开始一个动作

时间:2019-08-16 08:08:18

标签: angular rxjs ngrx

我需要显示我的应用程序中与一组特定过滤器匹配的所有用户的列表。我正在通过http get调用(“ getClass”)获取过滤器。当我收到一组过滤器的响应时,我必须进行另一个http调用以获取与那些过滤器匹配的用户。

因此,我执行了一个名为-GetClass的操作,并且还为该效果设置了GetClassSuccess。 我还有一个名为GetDirectory的动作和匹配效果将调度的匹配GetDirectorySuccess。

现在这是我的问题: 如果我编写了一系列命令:

this.store.dispatch(new directoryActions.GetClass());
this.store.dispatch(new directoryActions.GetDirectory());

GetClass操作触发GetClassSuccess操作,该操作使用正确的过滤器更新状态。然后,GetDirectory操作从状态中获取这些过滤器(使用withLatestFrom)并发出getUsers的http请求。然后,它触发GetDirectorySuccess,后者与匹配过滤器的用户一起更新状态。

我不能保证myClass将在GetDirectory启动时结束。实际上,它永远不会。

那么在开始另一个动作之前,确保动作已完成的最佳方法是什么。我是否应该制作另一个监听“ GetClassSuccess”然后分派“ GetDirectory”操作的效果?

1 个答案:

答案 0 :(得分:0)

您可以这样做

@Effect()
login$: Observable <Action> = this
.actions$
.pipe(ofType<authAction.Login>(authAction.LoginActionTypes.LOGIN), mergeMap(action => this.authService.login(action.payload).pipe(
// If successful, dispatch success action with result
map(data => ({type: authAction.LoginActionTypes.LOGIN_SUCCESS})),
// If request fails, dispatch failed action
catchError(() => of({type: authAction.LoginActionTypes.LOGIN_FAIL})))));


@Effect({dispatch: false})
loginSuccess$ = this
.actions$
.pipe(ofType(authAction.LoginActionTypes.LOGIN_SUCCESS), tap(() => this.router.navigate(['/portal'])));

因此,您会看到第一个效果返回类型LOGIN_SUCCESS。次要效果将监听LOGIN_SUCCESS动作并执行次要效果