| import { Subject } from './Subject'; |
| import { Subscriber } from './Subscriber'; |
| |
| /** |
| * A variant of Subject that only emits a value when it completes. It will emit |
| * its latest value to all its observers on completion. |
| * |
| * @class AsyncSubject<T> |
| */ |
| export class AsyncSubject<T> extends Subject<T> { |
| private _value: T | null = null; |
| private _hasValue = false; |
| private _isComplete = false; |
| |
| /** @internal */ |
| protected _checkFinalizedStatuses(subscriber: Subscriber<T>) { |
| const { hasError, _hasValue, _value, thrownError, isStopped, _isComplete } = this; |
| if (hasError) { |
| subscriber.error(thrownError); |
| } else if (isStopped || _isComplete) { |
| _hasValue && subscriber.next(_value!); |
| subscriber.complete(); |
| } |
| } |
| |
| next(value: T): void { |
| if (!this.isStopped) { |
| this._value = value; |
| this._hasValue = true; |
| } |
| } |
| |
| complete(): void { |
| const { _hasValue, _value, _isComplete } = this; |
| if (!_isComplete) { |
| this._isComplete = true; |
| _hasValue && super.next(_value!); |
| super.complete(); |
| } |
| } |
| } |