在 Angular 服务中,通常使用 RxJS 主题和可观察对象来管理状态。但是,这些构造自然不会提供在订阅之外检索其当前值的方法。本文探讨了如何在这种情况下访问当前值。
考虑以下 Angular 服务,该服务利用主题来管理布尔属性 isLoggedIn:
<code class="typescript">import {Subject} from 'rxjs/Subject'; import {Injectable} from 'angular2/core'; @Injectable() export class SessionStorage { private _isLoggedInSource = new Subject<boolean>(); isLoggedIn = this._isLoggedInSource.asObservable(); ... }</code>
在某些情况下,您可以需要访问 isLoggedIn 的当前值而不订阅它。这对于常规主题来说是不可能的,因为它只向订阅者发送值,并不存储其当前状态。
解决方案:使用BehaviorSubject
克服这个问题限制,请考虑切换到BehaviorSubject,这是一种专门的 RxJS 类型,它维护一个内部缓冲区来存储最新发出的值。
<code class="typescript">import {BehaviorSubject} from 'rxjs/BehaviorSubject'; @Injectable() export class SessionStorage { private _isLoggedInSource = new BehaviorSubject<boolean>(false); isLoggedIn = this._isLoggedInSource.asObservable(); ... }</code>
与Subject 相比,BehaviorSubject 有两个主要优点:
以BehaviorSubject为例:
使用BehaviorSubject,即使不订阅也可以访问isLoggedIn的当前值:
<code class="typescript">const sessionStorage = new SessionStorage(); const isLoggedInCurrentValue = sessionStorage._isLoggedInSource.getValue(); console.log(isLoggedInCurrentValue); // True or False</code>
综上,如果需要访问isLoggedIn的当前值RxJS主题或Observable,考虑切换到BehaviorSubject,它既为新订阅者提供立即发射,又提供用于直接检索的 getValue() 方法。
以上是如何在 Angular 中访问 RxJS 主题或 Observable 的当前值?的详细内容。更多信息请关注PHP中文网其他相关文章!