加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – ngrx效果:由其他效果立即处理的一个效果调度的动作

发布时间:2020-12-17 18:06:01 所属栏目:安全 来源:网络整理
导读:我有一个带有四个ngrx动作的Angular(2)应用程序: 开始 不由减速机处理(无状态变化) ngrx Effect调用异步任务并映射到SUCCESS或ERROR 成功 由减速机处理 ngrx效果映射到ADVANCE 进展 未由减速机处理 ngrx效果导航到不同的路线 错误 由减速机处理 没有效果 问
我有一个带有四个ngrx动作的Angular(2)应用程序:

>开始

>不由减速机处理(无状态变化)
> ngrx Effect调用异步任务并映射到SUCCESS或ERROR

>成功

>由减速机处理
> ngrx效果映射到ADVANCE

>进展

>未由减速机处理
> ngrx效果导航到不同的路线

>错误

>由减速机处理
>没有效果

问题是捕获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语句,输出如下所示:

>成功效果
> ADVANCE效果(显示route.foo === null)
> SUCCESS减速机(显示route.foo ===的东西)
>错误

我期望SUCCESS效果和SUCCESS减速器在ADVANCE效果之前运行.

难道我做错了什么?

期望reducers以与调度它们相同的顺序处理操作是不正确的吗?

版本:

> @ angular / cli:1.0.0-beta.32.3
>节点:7.5.0
> os:darwin x64
> @ angular / common:2.4.7
> @ angular / compiler:2.4.7
> @ angular / core:2.4.7
> @ angular / forms:2.4.7
> @ angular / http:2.4.7
> @ angular / platform-b??rowser:2.4.7
> @ angular / platform-b??rowser-dynamic:2.4.7
> @ angular / router: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

解决方法

回答你的结论性问题:

  • Am I doing something wrong?

>不,我不认为你做错了什么.

  • Is it incorrect to expect that actions are processed by the reducers in the same order that they are dispatched?

>那个顺序似乎合乎逻辑,但显然你现在不能指望这样

似乎有一个导致此行为的错误.您很可能正在体验它,因为您直接映射到另一个动作.通常,如果您有异步操作或类似的操作,则reducer有时间在听取下一个操作开始的效果之前完成.

也许不是您问题的一部分,但是您指定问题的解决方案是在您的有效负载的帮助下直接在SUCCESS中导航到您的新路由,或者将有效负载传递给ADVANCE.

以下链接是与您相关的效果,存储和rxjs项目中报告的问题:

> https://github.com/ngrx/effects/issues/58
> https://github.com/ngrx/store/issues/279
> / ReactiveX / rxjs / issues / 2155(链接到这个的声誉太小)

好像他们正在努力:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读