ngrx可以强制执行订购吗?

时间:2018-02-20 17:33:35

标签: angular ngrx

我正在使用ngrx测试原型Angular 2应用程序。在几乎所有情况下,操作都必须在更新状态之前异步地从后端API获取数据。我正在使用标准方法在ngrx / effects中执行此操作,通过获取数据然后创建另一个操作来使用featched数据处理状态(当然使用reducer)

我注意到的是,第二个操作是按照从后端检索数据的顺序处理的,而不是按照启动操作的顺序处理的。这可能会产生一些不幸的影响。

ngrx中是否有一种标准方法可以确保操作(包括依赖操作)按照调度顺序进行处理?

3 个答案:

答案 0 :(得分:4)

您绝对可以确保可观察对象按顺序执行(一个接一个地依次执行)。

我们有concat运算符,您可以在其中连接concat(obs1 $,ob2 $)等运算符。在此obs1 $将首先执行,然后在obs2 $将执行。假设一个formControl valueChange发出了价值,我们为每个Change调度事件。

并且让我们说我们要按顺序执行更高阶的可观测对象。在这种情况下,我们可以使用concatMap运算符。

this.formControl.valueChanges.pipe(
    concatMap(value => this.http.get('url'))
)

希望它会在某种程度上帮助您。

答案 1 :(得分:0)

如果要进行排序,则需要在操作中使用相关ID来区分不同的调用,并将导致后端请求的操作与其响应操作连接在一起。 然后,您就知道了序列是如何开始的,并且可以按相同顺序转换响应序列。 最重要的问题-效果如何相互了解? 答案:通过this.actions$: Actions,您可以将其与效果类内部的switchMap连接,并执行ofType以检测所需的动作。

this.actions$.pipe(
  ofType(actions.startSequence),

  // some activity here. for example
  switchMap(action => this.actions$.pipe(ofType(actions.causeRequest)),

  takeUntil(this.actions$.pipe(ofType(actions.stopSequence))),
  repeat(),
);

答案 2 :(得分:-1)

您可以使用forkJoin来调用多个异步API并将其作为单个有序结果进行管理,这可以通过任何Observable对象(例如您的ngrx/effects)来完成:

import { ajax } from 'rxjs/ajax';
import { forkJoin } from 'rxjs';

/*
  when all observables complete, provide the last
  emitted value from each as dictionary
*/
forkJoin(
  // as of RxJS 6.5+ we can use a dictionary of sources
  {
    google: ajax.getJSON('https://api.github.com/users/google'),
    microsoft: ajax.getJSON('https://api.github.com/users/microsoft'),
    users: ajax.getJSON('https://api.github.com/users')
  }
)
  // { google: object, microsoft: object, users: array }
  .subscribe(console.log);