NGRX:通过select方法订阅可观察的返回是同步还是异步?

时间:2019-06-10 06:16:38

标签: observable ngrx

我在Angular项目中使用NGRX,因为我们知道store.select的返回值是Observable的类型。在我的service之一中,我计划获取状态值,并将该值用作API请求的输入参数。如下:

// the userIDs$ is return by store.select method
this.demoService.userIDs$.subscribe((res) => {
  console.log('userids', res); //  output first
})
console.log('after wellids...') //  output after the console in subscription callback
this.http.post<string[]>(
  url, 
  { ids: userids} // the user ids as input parameter
);

我的问题是可以观察到userIDs,回调是同步还是异步?根据我的调试,第一个控制台在第二个控制台(订阅之外的那个)之前运行。谢谢

1 个答案:

答案 0 :(得分:1)

在NGRX中,商店本身只是BehaviorSubject

将新值发送到BehaviorSubjet中时,所有回调将在同一刻度上调用,因此基本上是同步。当然,如果您在回调之前为delay申请了ex,则它将变为异步。

也就是说,我不鼓励您这样使用商店,而只是将您的代码重写如下:

this.demoService.userIDs$.pipe(
  first(),
  tap(userIDs => console.log({ userIDs })),
  mergeMap(userIDs => this.http.post<string[]>(url, { ids: userids }))
);

这样,您根本不在乎同步还是异步。 您只需将整个数据源放在一个流中即可。

它也更安全,因为如果稍后在应用中调用该流时,您可以取消它(使用switchMap)。

另外,请注意使用first,因为在您的情况下,您保持userIDs$流处于打开状态(我认为在这种情况下会导致内存泄漏)。