You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中NgRx Effect请求成功后如何根据返回数据跳转路由?

NgRx 路由跳转逻辑方案说明

方案1:直接在现有Effect中处理(仅推荐跳转逻辑永久和创建操作强绑定时使用)

这种方式实现最简单,直接在接收到接口返回数据后,先执行跳转,再返回成功Action即可。
首先修正你原有代码的语法错误:catchError 错误放在了map的入参位置,需要调整为和map平级的管道操作符。同时你原有错误捕获逻辑直接返回of(error),没有封装成失败Action,会导致类型校验报错,也无法处理创建失败的后续逻辑,同步做了修正。
修改后的代码:

createAssignment$ = createEffect(() =>
  this.action$.pipe(
    ofType(AssignmentActions.createAssignment),
    switchMap((action) =>
      this.assignmentService.createNewAssignment(action.assignmentTo).pipe(
        map((data) => {
          // 新增路由跳转逻辑
          this.router.navigate(data);
          return AssignmentActions.createAssignmentSuccess({ createdAssignment: data });
        }),
        catchError((error) => of(AssignmentActions.createAssignmentFailure({ error })))
      )
    )
  )
);

方案2:新增独立Effect处理跳转(推荐)

这是更符合NgRx设计原则的实现,符合关注点分离的要求:原有Effect只负责处理接口请求、分发成功/失败Action,路由跳转作为独立的副作用单独维护,后续如果有其他场景需要触发生成成功后的跳转、或者需要新增跳转前置校验逻辑(比如权限判断、参数合法性校验)时,不需要修改原有创建逻辑的代码,可维护性更强,也方便用Redux DevTools做流程调试。
实现代码如下:

// 原有创建Assignment的Effect保持不变,仅修正语法和错误捕获逻辑即可
createAssignment$ = createEffect(() =>
  this.action$.pipe(
    ofType(AssignmentActions.createAssignment),
    switchMap((action) =>
      this.assignmentService.createNewAssignment(action.assignmentTo).pipe(
        map((data) => AssignmentActions.createAssignmentSuccess({ createdAssignment: data })),
        catchError((error) => of(AssignmentActions.createAssignmentFailure({ error })))
      )
    )
  )
);

// 新增独立的路由跳转Effect
navigateAfterCreateSuccess$ = createEffect(() =>
  this.action$.pipe(
    ofType(AssignmentActions.createAssignmentSuccess),
    tap((action) => this.router.navigate(action.createdAssignment))
  ),
  { dispatch: false } // 该Effect不需要返回新的Action,关闭dispatch避免运行时警告
);

选型建议

  • 如果项目体量很小,且确定createAssignmentSuccess永远只有创建操作这一个触发来源,跳转逻辑也不会有后续扩展,可以选择方案1
  • 绝大多数中大型项目、或者后续有迭代可能的项目,都推荐使用方案2,符合NgRx的官方最佳实践

内容的提问来源于stack exchange,提问作者Miomir Dancevic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:54:02