我一直发现自己正在编写如下代码:
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.
}
}
这是反模式吗?我应该怎么做,要求是:
答案 0 :(得分:3)
出于以下原因,我想说这绝对是一种反模式:
next
通知。next
通知-因为订阅者将被同步取消订阅。该模式仅适用于仅发出单个next
通知的同步源。在这种情况下,unsubscribe
是多余的,因为当源完成时,订户将自动退订。
IMO,如果您知道源仅发出一个next
通知,则应该忽略unsubscribe
。如果不确定,则应在订阅点使用first
或take(1)
。
还有另一种机制可用于在收到第一个next
通知时退订,但我不鼓励这样做,因为它需要使用非箭头功能。
在调用next
处理程序时,将订户用作上下文,因此可以在其上调用unsubscribe
,如下所示:
source.subscribe(function (value) {
/* do something with value */
this.unsubscribe();
});