123456789101112131415161718192021222324252627282930313233343536373839 |
- 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.
- */
- 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();
- }
- }
- }
|