【问题标题】:Starting an Action after another action's effect is finished dispatching its success action在另一个动作的效果完成调度其成功动作后启动一个动作
【发布时间】:2019-08-16 08:08:18
【问题描述】:

我需要在我的应用程序中显示与一组特定过滤器匹配的所有用户的列表。我通过 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”动作?

【问题讨论】:

  • 您在 GetClass 效果中调用 GetClassSuccess。您也可以在 GetClassSuccess 效果中调用 GetDirectory。
  • 稍微细化@MoxxiManagarm 的答案,如果GetClassSuccess 需要 调用GetDirectory,您可以在@ 中传递一个布尔值987654324@ payload 告诉它是否调度GetDirectory
  • GetClass 成功使用过滤器更新状态,然后 GetDirectory 从状态中获取过滤器并带来匹配的用户。
  • 这方面有什么更新吗?
  • 不。我正在使用另一种效果。在我看来,必须有更好的解决方案购买,也许我错了。但是@WillAlexander 和 MoxxiManagarm 的解决方案可以在某些情况下提供帮助

标签: angular rxjs ngrx


【解决方案1】:

你可以这样做

@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。 Second Effect 将监听LOGIN_SUCCESS 动作并执行第二个效果

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2017-04-18
    • 2016-10-02
    相关资源
    最近更新 更多