From 801f28218e9812a5643e2e872de61b9f8b22a7ae Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Sun, 3 Jul 2016 23:20:23 -0700 Subject: [PATCH] fix(AsyncSubject): do not allow change value after complete closes #1800 --- spec/subjects/AsyncSubject-spec.ts | 15 +++++++++++++++ src/AsyncSubject.ts | 14 +++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/spec/subjects/AsyncSubject-spec.ts b/spec/subjects/AsyncSubject-spec.ts index e107fdeeec..a9f34b1380 100644 --- a/spec/subjects/AsyncSubject-spec.ts +++ b/spec/subjects/AsyncSubject-spec.ts @@ -79,6 +79,21 @@ describe('AsyncSubject', () => { expect(observer.results).to.deep.equal([2, 'done']); }); + it('should not allow change value after complete', () => { + const subject = new AsyncSubject(); + const observer = new TestObserver(); + const otherObserver = new TestObserver(); + subject.subscribe(observer); + + subject.next(1); + expect(observer.results).to.deep.equal([]); + subject.complete(); + expect(observer.results).to.deep.equal([1, 'done']); + subject.next(2); + subject.subscribe(otherObserver); + expect(otherObserver.results).to.deep.equal([1, 'done']); + }); + it('should not emit values if unsubscribed before complete', () => { const subject = new AsyncSubject(); const observer = new TestObserver(); diff --git a/src/AsyncSubject.ts b/src/AsyncSubject.ts index c04df50d56..ee35658126 100644 --- a/src/AsyncSubject.ts +++ b/src/AsyncSubject.ts @@ -6,11 +6,9 @@ import {Subscription} from './Subscription'; * @class AsyncSubject */ export class AsyncSubject extends Subject { - value: T = null; - - hasNext: boolean = false; - - hasCompleted: boolean = false; + private value: T = null; + private hasNext: boolean = false; + private hasCompleted: boolean = false; protected _subscribe(subscriber: Subscriber): Subscription { if (this.hasCompleted && this.hasNext) { @@ -26,8 +24,10 @@ export class AsyncSubject extends Subject { } next(value: T): void { - this.value = value; - this.hasNext = true; + if (!this.hasCompleted) { + this.value = value; + this.hasNext = true; + } } complete(): void {