Skip to content

Commit ed0eaf6

Browse files
luisgabrielkwonoj
authored andcommitted
fix(AsyncSubject): emit value when it's subscribed after complete
Currently, if a new subscription happens after `complete` the AsyncSubject will emit just `complete` instead of `next` and then `complete`.
1 parent 2c5bf41 commit ed0eaf6

File tree

2 files changed

+57
-6
lines changed

2 files changed

+57
-6
lines changed

spec/subjects/async-subject-spec.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,35 @@ describe('AsyncSubject', function () {
2323
expect(results).toEqual([2, 'done']);
2424
});
2525

26+
it('should emit the last value to subsequent subscriptions after complete', function () {
27+
var subject = new AsyncSubject();
28+
var results = [];
29+
30+
var observer = {
31+
next: function (x) {
32+
results.push(x);
33+
},
34+
error: null,
35+
complete: function () {
36+
results.push('done');
37+
}
38+
};
39+
var subscription = subject.subscribe(observer);
40+
41+
subject.next(1);
42+
expect(results).toEqual([]);
43+
subject.next(2);
44+
expect(results).toEqual([]);
45+
subject.complete();
46+
expect(results).toEqual([2, 'done']);
47+
48+
subscription.unsubscribe();
49+
50+
results = [];
51+
subject.subscribe(observer);
52+
expect(results).toEqual([2, 'done']);
53+
});
54+
2655
it('should just complete if no value has been nexted into it', function () {
2756
var subject = new AsyncSubject();
2857
var results = [];
@@ -38,6 +67,31 @@ describe('AsyncSubject', function () {
3867
expect(results).toEqual(['done']);
3968
});
4069

70+
it('should just complete to any subscription if no value has been nexted into it', function () {
71+
var subject = new AsyncSubject();
72+
var results = [];
73+
74+
var observer = {
75+
next: function (x) {
76+
results.push(x);
77+
},
78+
error: null,
79+
complete: function () {
80+
results.push('done');
81+
}
82+
};
83+
var subscription = subject.subscribe(observer);
84+
85+
expect(results).toEqual([]);
86+
subject.complete();
87+
expect(results).toEqual(['done']);
88+
89+
subscription.unsubscribe();
90+
results = [];
91+
subject.subscribe(observer);
92+
expect(results).toEqual(['done']);
93+
});
94+
4195
it('should only error if an error is passed into it', function () {
4296
var subject = new AsyncSubject();
4397
var results = [];

src/subject/AsyncSubject.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,11 @@ export class AsyncSubject<T> extends Subject<T> {
1212
}
1313

1414
_subscribe(subscriber: Subscriber<any>): Subscription<T> {
15-
const subscription = super._subscribe(subscriber);
16-
if (!subscription) {
17-
return;
18-
} else if (!subscription.isUnsubscribed && this._hasNext) {
15+
if (this.completeSignal && this._hasNext) {
1916
subscriber.next(this._value);
20-
subscriber.complete();
2117
}
22-
return subscription;
18+
19+
return super._subscribe(subscriber);
2320
}
2421

2522
_next(value: T): void {

0 commit comments

Comments
 (0)