我正在使用ngrx测试原型Angular 2应用程序。在几乎所有情况下,操作都必须在更新状态之前异步地从后端API获取数据。我正在使用标准方法在ngrx / effects中执行此操作,通过获取数据然后创建另一个操作来使用featched数据处理状态(当然使用reducer)
我注意到的是,第二个操作是按照从后端检索数据的顺序处理的,而不是按照启动操作的顺序处理的。这可能会产生一些不幸的影响。
ngrx中是否有一种标准方法可以确保操作(包括依赖操作)按照调度顺序进行处理?
答案 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);