angular – ngrx效果:由其他效果立即处理的一个效果调度的动作
我有一个带有四个ngrx动作的Angular(2)应用程序:
>开始 >不由减速机处理(无状态变化) >成功 >由减速机处理 >进展 >未由减速机处理 >错误 >由减速机处理 问题是捕获ADVANCE的效果似乎在处理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])); 我得到的错误是无法读取null的属性’bar’.属性foo由处理SUCCESS的reducer设置. 如果我为SUCCESS效果添加一个延迟,那么一切都很好: @Effect() success$= this.actions$ .ofType('SUCCESS') .delay(1) .map(() => ({type: 'ADVANCE'})); 但是不得不加上这个延迟对我来说没有意义. 我在各处添加了console.log语句,输出如下所示: >成功效果 我期望SUCCESS效果和SUCCESS减速器在ADVANCE效果之前运行. 难道我做错了什么? 期望reducers以与调度它们相同的顺序处理操作是不正确的吗? 版本: > @ angular / cli:1.0.0-beta.32.3 解决方法
回答你的结论性问题:
>不,我不认为你做错了什么.
>那个顺序似乎合乎逻辑,但显然你现在不能指望这样 似乎有一个导致此行为的错误.您很可能正在体验它,因为您直接映射到另一个动作.通常,如果您有异步操作或类似的操作,则reducer有时间在听取下一个操作开始的效果之前完成. 也许不是您问题的一部分,但是您指定问题的解决方案是在您的有效负载的帮助下直接在SUCCESS中导航到您的新路由,或者将有效负载传递给ADVANCE. 以下链接是与您相关的效果,存储和rxjs项目中报告的问题: > https://github.com/ngrx/effects/issues/58 好像他们正在努力:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – 不可变的,可打字的树的设计
- 将Angularjs动态绑定到新创建的html元素
- 抓住SIGINT在bash中,处理并忽略
- 打字稿 – 带有ReSharper 2016.1的Angular 2和Visual Studi
- typescript – Angular 2 Quickstart 404 GET /app/main.js
- bash – 如何在Shell命令中交换参数
- Bootstrap-折叠方法
- bash – 在shell脚本中使用if elif fi
- scala中.map(…)和.map {…}之间的区别是什么
- 当使用AngularJS HotTowel中的vm“ControllerAs”语法时,从