我在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
,回调是同步还是异步?根据我的调试,第一个控制台在第二个控制台(订阅之外的那个)之前运行。谢谢
答案 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$
流处于打开状态(我认为在这种情况下会导致内存泄漏)。