| import { Subject } from './Subject'; |
| import { Subscriber } from './Subscriber'; |
| import { Subscription } from './Subscription'; |
| |
| /** |
| * 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; |
| private hasNext: boolean = false; |
| private hasCompleted: boolean = false; |
| |
| /** @deprecated This is an internal implementation detail, do not use. */ |
| _subscribe(subscriber: Subscriber<any>): Subscription { |
| if (this.hasError) { |
| subscriber.error(this.thrownError); |
| return Subscription.EMPTY; |
| } else if (this.hasCompleted && this.hasNext) { |
| subscriber.next(this.value); |
| subscriber.complete(); |
| return Subscription.EMPTY; |
| } |
| return super._subscribe(subscriber); |
| } |
| |
| next(value: T): void { |
| if (!this.hasCompleted) { |
| this.value = value; |
| this.hasNext = true; |
| } |
| } |
| |
| error(error: any): void { |
| if (!this.hasCompleted) { |
| super.error(error); |
| } |
| } |
| |
| complete(): void { |
| this.hasCompleted = true; |
| if (this.hasNext) { |
| super.next(this.value); |
| } |
| super.complete(); |
| } |
| } |