angular - ngrx 效果 : Are actions dispatched by one effect processed immediately by other effects?

标签 angular ngrx ngrx-effects

我有一个具有四个 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 语句,输出如下所示:

  1. 成功效果
  2. ADVANCE 效果(显示 route.foo === null)
  3. SUCCESS reducer (显示 route.foo === 东西)
  4. 错误

我预计 SUCCESS 效果和 SUCCESS reducer 在 ADVANCE 效果之前运行。

我做错了什么吗?

期望 reducer 以与分派(dispatch)它们相同的顺序处理操作是不正确的吗?


版本:

  • @angular/cli: 1.0.0-beta.32.3
  • 节点:7.5.0
  • 操作系统: Darwin x64
  • @angular/common: 2.4.7
  • @angular/编译器:2.4.7
  • @angular/核心:2.4.7
  • @angular/forms: 2.4.7
  • @angular/http: 2.4.7
  • @angular/平台浏览器:2.4.7
  • @angular/platform-b​​rowser-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

最佳答案

回答您的结论性问题:

  • 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 有时间在 effect 开始监听下一个 Action 之前完成。

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

下面的链接是与您的相关的 effects-、store- 和 rxjs-projects 中报告的问题:

看起来他们正在努力:)

关于angular - ngrx 效果 : Are actions dispatched by one effect processed immediately by other effects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42731937/

相关文章:

angular - 如何在导入时没有 "dist"的情况下在 NPM 上发布 TypeScript 模块?

node.js - 如何使用 angular-cli 加载包?

javascript - 如何从本地驱动器打开文件 - Angular 4

javascript - 聚合组多个_id和访问权限

angular - NgRx 对 switchMap 和 catchError 的影响 - 有人可以解释我的代码和 'correct' 代码之间可观察到的工作流的区别吗?

Angular2 NGRX 调度时出现性能问题?

javascript - typescript 函数参数

javascript - 如何最好地使用 react 状态?

angular - 我如何编写 NgRx 8 Effect 来触发 promise 的 Action

angular - NGRX 通过@Effect 将焦点放在输入上