gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:40:41 26 4
gpt4 key购买 nike

我有一个具有四个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com