diff options
Diffstat (limited to 'node_modules/rxjs/src/internal/AsyncSubject.ts')
| -rw-r--r-- | node_modules/rxjs/src/internal/AsyncSubject.ts | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/node_modules/rxjs/src/internal/AsyncSubject.ts b/node_modules/rxjs/src/internal/AsyncSubject.ts new file mode 100644 index 0000000..abb086c --- /dev/null +++ b/node_modules/rxjs/src/internal/AsyncSubject.ts @@ -0,0 +1,39 @@ +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(); + } + } +} |
