我应该在 BehaviorSubject 中使用 asObservable 吗?

IT技术 javascript reactjs angular rxjs behaviorsubject
2021-03-25 03:23:00

我想知道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)
    }
}

上面哪种方法更好用,或者这两种方法的优缺点是什么?

更新:上次我最终确定了正确的用法如下:

// 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)
}
1个回答

实际上,在 TypeScript 中推荐的方法只是通过这样的类型转换:

private messageSubject = new BehaviorSubject<any>(undefined);

public messages$: Observable<any> = this.messageSubject;

这样,TypeScript 编译器不会让您调用next(),error()complete(). 使用asObservable()在纯JavaScript使用RxJS时只recommened。例如,在 RxJS 源代码内部,它从不使用,asObservable()即使它使用和公开 Subjects => Observables 很多。

有关更多信息,请参阅讨论:https : //github.com/ReactiveX/rxjs/pull/2408

所以,你的意思是我应该使用用途II通过只是改变currentMessage = this.messageSubject.asObservable();public messages$: Observable<any> = this.messageSubject;
2021-05-24 03:23:00
在你返回的第一个例子中BehaviorSubject,是的,你可以只使用public messages$: Observable<any> = this.messageSubject;
2021-05-27 03:23:00
我不明白你的意思。您可以在BehaviorSubject实例上调用它
2021-05-27 03:23:00
另一方面,在我的示例中,用法 I 和 II 之间有什么区别?
2021-06-09 03:23:00
非常感谢你。在这种情况下,我可以使用 next()、error() 或 complete() 吗?如果是这样,按照您的建议使用它是否会不利?
2021-06-18 03:23:00