observable.subscribe(..)。unsubscribe();反模式。

时间:2018-07-18 03:10:11

标签: rxjs

我一直发现自己正在编写如下代码:

class WidgetService {

   getWidgets() {
       return this.authService.user.pipe(  //authService.user is an Observable, that emits the currently authenticated users. 
         first(user => user!=null),  //Make sure a null object isn't coming through
         switchMap(user => {
            return this.collection.getWhere("widget.ownerId", "==", user.id); //Get all the widgets for that user
         })
       ); 
   }

}

class WidgetDisplayComponent {

    ngOnInit() {
       this.widgetService.getWidget().subscribe(widget => this.widget = widget).unsubscribe(); //Subscribe to cause the Observable to pipe, get the widget, then unsubscribe. 
    }
}

这是反模式吗?我应该怎么做,要求是:

  • 为了获取我要提取的项目,我需要依赖另一个Observable。
  • 我只需要获得一次即可。

1 个答案:

答案 0 :(得分:3)

出于以下原因,我想说这绝对是一种反模式:

  • 对于同步源,无法保证您只会收到一个next通知。
  • 使用异步源,您将不会收到任何next通知-因为订阅者将被同步取消订阅。

该模式仅适用于仅发出单个next通知的同步源。在这种情况下,unsubscribe是多余的,因为当源完成时,订户将自动退订。

IMO,如果您知道源仅发出一个next通知,则应该忽略unsubscribe。如果不确定,则应在订阅点使用firsttake(1)


还有另一种机制可用于在收到第一个next通知时退订,但我不鼓励这样做,因为它需要使用非箭头功能。

在调用next处理程序时,将订户用作上下文,因此可以在其上调用unsubscribe,如下所示:

source.subscribe(function (value) {
  /* do something with value */
  this.unsubscribe();
});