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(); | |
} | |
} | |
} | |