【发布时间】:2017-08-01 14:21:27
【问题描述】:
我有一个具有四个 ngrx 操作的 Angular (2) 应用程序:
- 开始
- reducer 未处理(无状态更改)
- ngrx Effect 调用异步任务并映射到 SUCCESS 或 ERROR
- 成功
- 由reducer处理
- ngrx 效果映射到 ADVANCE
- 高级
- reducer 未处理
- ngrx 效果导航到不同的路线
- 错误
- 由reducer处理
- 没有效果
问题在于,捕获 ADVANCE 的 Effect 似乎在处理 SUCCESS 的 reducer 之前运行
这是效果代码:
@Effect() start$ = this.actions$
.ofType('START')
.map(toPayload)
.switchMap(input => doAsyncTask(input)
.map(result => ({type: 'SUCCESS', payload: result}))
.catch(error => ({type: 'ERROR', payload: error})));
@Effect() success$ = this.actions$
.ofType('SUCCESS')
.map(() => ({type: 'ADVANCE'}));
@Effect({dispatch: false}) advance$ = this.actions$
.ofType('ADVANCE')
.withLatestFrom(this.store$.select(state => state.route))
.map(action_route => action_route[1])
.do(route => this.router.navigate([route.foo.bar]));
我得到的错误是Cannot read property 'bar' of null。 foo 属性由处理 SUCCESS 的 reducer 设置。
如果我为 SUCCESS 效果添加延迟,一切都会很好:
@Effect() success$ = this.actions$
.ofType('SUCCESS')
.delay(1)
.map(() => ({type: 'ADVANCE'}));
但必须添加此延迟对我来说没有意义。
我在各处添加了console.log 语句,输出如下所示:
- 成功效应
- ADVANCE 效果(显示 route.foo === null)
- SUCCESS reducer(显示 route.foo === 某些东西)
- 错误
我预计 SUCCESS 效果和 SUCCESS reducer 在 ADVANCE 效果之前运行。
我做错了吗?
期望reducer 以与调度相同的顺序处理动作是不正确的吗?
版本:
- @angular/cli: 1.0.0-beta.32.3
- 节点:7.5.0
- 操作系统:darwin x64
- @angular/common: 2.4.7
- @angular/编译器:2.4.7
- @angular/core: 2.4.7
- @angular/forms: 2.4.7
- @angular/http:2.4.7
- @angular/platform-browser: 2.4.7
- @angular/platform-browser-dynamic: 2.4.7
- @angular/路由器:3.4.7
- @angular/cli: 1.0.0-beta.32.3
- @angular/compiler-cli: 2.4.7
- @ngrx/core@1.2.0
- @ngrx/effects@2.0.0
- @ngrx/store@2.2.1
- rxjs:5.1.1
【问题讨论】:
-
您使用的是什么版本?通过类似的安排,我看到减速器在效果之前处理动作。
-
@cartant - 我将版本添加到问题中。感谢您的检查。
-
我的
@ngrx版本是一样的。你的 RxJS 版本呢?我的是5.2.0。您可能还想在问题中包含您的NgModule引导程序。 -
store(通过reducer manager)和observable的效果动作都订阅了dispatcher。听起来您的效果以某种方式在商店之前订阅了调度程序。
-
@cartant - 我有 rxjs 5.1.1。我昨天花了几个小时调试这个但没有得到任何结果。我今天会多花一些。
标签: angular ngrx ngrx-effects