Fre*_*ick 5 javascript rxjs reactjs behaviorsubject angular
我想知道BehaviorSubject.
据我所知:
asObservable 方法不仅将其转换为 Observable,还移除了 Observer 实现。因此,您无法在 asObservable() 返回的实例上调用 next、error & complete。
但以下内容也让我感到困惑:
通过仅公开 asObservable,您可以使用发出的值,但防止从创建此 BehaviorSubject 的服务外部更改 BehaviorSubject。为此,请使用 asObservable()。
这些定义有什么问题吗?
export class DataService {
// usage I : using getter
private messageSubject = new BehaviorSubject<any>(undefined);
getMessage(): BehaviorSubject<any> {
return this.messageSubject;
}
setMessage(param: any): void {
this.messageSubject.next(param);
}
// usage II : using asObservable()
private messageSubject = new BehaviorSubject<any>(undefined);
currentMessage = this.messageSubject.asObservable();
setMessage(param: any) {
this.messageSubject.next(param)
}
}
Run Code Online (Sandbox Code Playgroud)
上面哪种方法更好用,或者这两种方法的优缺点是什么?
更新:上次我最终确定了正确的用法如下:
// usage III : using @martin's approach:
private messageSubject = new BehaviorSubject<any>(undefined);
public messages$: Observable<any> = this.messageSubject;
//should I set the observable still using the following method without any changing? Or do I need an update?
setMessage(param: any) {
this.messageSubject.next(param)
}
Run Code Online (Sandbox Code Playgroud)
mar*_*tin 13
实际上,在 TypeScript 中执行此操作的推荐方法是仅通过类型转换,如下所示:
private messageSubject = new BehaviorSubject<any>(undefined);
public messages$: Observable<any> = this.messageSubject;
Run Code Online (Sandbox Code Playgroud)
这样,TypeScript 编译器就不会让你调用next(),error()或complete()。仅当在纯 JavaScript 中使用 RxJS 时才建议使用asObservable()。例如,在 RxJS 源代码内部,它从未使用过,asObservable()尽管它大量使用和公开了Subjects => Observables。
有关更多信息,请参阅讨论:https://github.com/ReactiveX/rxjs/pull/2408
| 归档时间: |
|
| 查看次数: |
930 次 |
| 最近记录: |