AsyncSubject.ts 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { Subject } from './Subject';
  2. import { Subscriber } from './Subscriber';
  3. import { Subscription } from './Subscription';
  4. /**
  5. * @class AsyncSubject<T>
  6. */
  7. export class AsyncSubject<T> extends Subject<T> {
  8. private value: T = null;
  9. private hasNext: boolean = false;
  10. private hasCompleted: boolean = false;
  11. /** @deprecated internal use only */ _subscribe(subscriber: Subscriber<any>): Subscription {
  12. if (this.hasError) {
  13. subscriber.error(this.thrownError);
  14. return Subscription.EMPTY;
  15. } else if (this.hasCompleted && this.hasNext) {
  16. subscriber.next(this.value);
  17. subscriber.complete();
  18. return Subscription.EMPTY;
  19. }
  20. return super._subscribe(subscriber);
  21. }
  22. next(value: T): void {
  23. if (!this.hasCompleted) {
  24. this.value = value;
  25. this.hasNext = true;
  26. }
  27. }
  28. error(error: any): void {
  29. if (!this.hasCompleted) {
  30. super.error(error);
  31. }
  32. }
  33. complete(): void {
  34. this.hasCompleted = true;
  35. if (this.hasNext) {
  36. super.next(this.value);
  37. }
  38. super.complete();
  39. }
  40. }