我应该在 BehaviorSubject 中使用 asObservable 吗? [关闭]

Posted

技术标签:

【中文标题】我应该在 BehaviorSubject 中使用 asObservable 吗? [关闭]【英文标题】:Should I use asObservable in BehaviorSubject? [closed] 【发布时间】:2022-01-04 07:05:57 【问题描述】:

我想知道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()。仅在纯 javascript 中使用 RxJS 时才推荐使用 asObservable()。例如,在 RxJS 源代码内部,它从不使用 asObservable(),即使它大量使用和公开 Subjects => Observables。

更多信息见讨论:https://github.com/ReactiveX/rxjs/pull/2408

【讨论】:

那么,你的意思是我应该通过justcurrentMessage = this.messageSubject.asObservable();更改为public messages$: Observable&lt;any&gt; = this.messageSubject;来使用usage II吗? 另一方面,在我的示例中,用法 I 和 II 之间有什么区别? 在第一个示例中,您将返回 BehaviorSubject,是的,您可以只使用 public messages$: Observable&lt;any&gt; = this.messageSubject; 非常感谢。在这种情况下,我可以使用 next()、error() 或 complete() 吗?如果是这样,按照您的建议使用它会是一个缺点吗? 我不明白你的意思。您可以在 BehaviorSubject 实例上调用它。

以上是关于我应该在 BehaviorSubject 中使用 asObservable 吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 rxjs5 获取 BehaviorSubject 当前值的简单方法

找不到模块 'rxjs/subject/BehaviorSubject'

延迟Rxjs BehaviorSubject机制

使用 BehaviorSubject 重新加载时的角度数据丢失

Angular 6 BehaviorSubject 使用 LocalStorage

RxJS - BehaviorSubject,onComplete 未调用