| import { Subject } from './Subject'; |
| import { Subscriber } from './Subscriber'; |
| import { Subscription } from './Subscription'; |
| |
| /** |
| * A variant of Subject that requires an initial value and emits its current |
| * value whenever it is subscribed to. |
| * |
| * @class BehaviorSubject<T> |
| */ |
| export class BehaviorSubject<T> extends Subject<T> { |
| constructor(private _value: T) { |
| super(); |
| } |
| |
| get value(): T { |
| return this.getValue(); |
| } |
| |
| /** @internal */ |
| protected _subscribe(subscriber: Subscriber<T>): Subscription { |
| const subscription = super._subscribe(subscriber); |
| !subscription.closed && subscriber.next(this._value); |
| return subscription; |
| } |
| |
| getValue(): T { |
| const { hasError, thrownError, _value } = this; |
| if (hasError) { |
| throw thrownError; |
| } |
| this._throwIfClosed(); |
| return _value; |
| } |
| |
| next(value: T): void { |
| super.next((this._value = value)); |
| } |
| } |