我有一个具有四个 ngrx 操作的 Angular (2) 应用程序:
- 开始
- 没有被reducer处理(没有状态改变)
- ngrx Effect 调用异步任务并映射到 SUCCESS 或 ERROR
- 成功
- 由减速机处理
- ngrx 效果映射到 ADVANCE
- 进步
- 不被减速机处理
- ngrx 效果导航到不同的路线
- 错误
- 由减速机处理
- 没有效果
问题是捕获 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 减速器在 ADVANCE 效果之前运行。
难道我做错了什么?
期望减速器以与调度相同的顺序处理动作是不正确的吗?
版本:
- @angular/cli:1.0.0-beta.32.3
- 节点:7.5.0
- 操作系统:达尔文 x64
- @角/普通:2.4.7
- @角/编译器:2.4.7
- @角/核心:2.4.7
- @角/形式:2.4.7
- @角/http:2.4.7
- @角/平台浏览器:2.4.7
- @角/平台浏览器动态:2.4.7
- @角/路由器:3.4.7
- @angular/cli:1.0.0-beta.32.3
- @angular/compiler-cli:2.4.7
- @ngrx/core@1.2.0
- @ngrx/效果@2.0.0
- @ngrx/store@2.2.1
- rxjs:5.1.1