【问题标题】:NGRX: subscribe to Observable return by select method is sync or async?NGRX:通过select方法订阅Observable返回是同步还是异步?
【发布时间】:2019-06-10 06:16:38
【问题描述】:

我在我的 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 observable,回调是同步还是异步?根据我的调试,第一个控制台在第二个控制台(订阅之外的那个)之前运行。谢谢你

【问题讨论】:

    标签: observable ngrx


    【解决方案1】:

    在 NGRX 中,商店本身只是一个BehaviorSubject

    当一个新值被发送到BehaviorSubjet 中时,所有的回调都将在同一个tick 上被调用,所以它基本上是同步的。当然,如果你在回调之前应用了delay for ex,那么它就会变成异步的。

    也就是说,我不鼓励你以这种方式使用商店,我只是重写你的代码如下:

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

    这样你根本不关心它是同步的还是异步的。 您只需将整个数据源保存在一个流中即可。

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 2017-11-30
      • 1970-01-01
      • 2021-11-04
      • 2019-01-17
      • 1970-01-01
      • 2019-09-12
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多