Skip to content

Commit dd8bdf3

Browse files
authored
fix(AsyncSubject): properly emits values during reentrant subscriptions (#6522)
Resolves #6520
1 parent a675423 commit dd8bdf3

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

spec/subjects/AsyncSubject-spec.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ describe('AsyncSubject', () => {
211211
expect(calls).to.equal(1);
212212
});
213213

214-
it('should not be reentrant via next', () => {
214+
it('should not be reentrant via next', () => {
215215
const subject = new AsyncSubject<number>();
216216
let calls = 0;
217217
subject.subscribe({
@@ -229,4 +229,25 @@ describe('AsyncSubject', () => {
229229

230230
expect(calls).to.equal(1);
231231
});
232+
233+
it('should allow reentrant subscriptions', () => {
234+
const subject = new AsyncSubject<number>()
235+
let results: any[] = [];
236+
237+
subject.subscribe({
238+
next: (value) => {
239+
subject.subscribe({
240+
next: value => results.push('inner: ' + (value + value)),
241+
complete: () => results.push('inner: done')
242+
});
243+
results.push('outer: ' + value);
244+
},
245+
complete: () => results.push('outer: done')
246+
});
247+
248+
subject.next(1);
249+
expect(results).to.deep.equal([]);
250+
subject.complete();
251+
expect(results).to.deep.equal(['inner: 2', 'inner: done', 'outer: 1', 'outer: done']);
252+
});
232253
});

src/internal/AsyncSubject.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ export class AsyncSubject<T> extends Subject<T> {
1414

1515
/** @internal */
1616
protected _checkFinalizedStatuses(subscriber: Subscriber<T>) {
17-
const { hasError, _hasValue, _value, thrownError, isStopped } = this;
17+
const { hasError, _hasValue, _value, thrownError, isStopped, _isComplete } = this;
1818
if (hasError) {
1919
subscriber.error(thrownError);
20-
} else if (isStopped) {
20+
} else if (isStopped || _isComplete) {
2121
_hasValue && subscriber.next(_value!);
2222
subscriber.complete();
2323
}

0 commit comments

Comments
 (0)