@@ -16,6 +16,9 @@ import { errorContext } from './util/errorContext';
16
16
*/
17
17
export class Subject < T > extends Observable < T > implements SubscriptionLike {
18
18
closed = false ;
19
+
20
+ private currentObservers : Observer < T > [ ] | null = null ;
21
+
19
22
/** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
20
23
observers : Observer < T > [ ] = [ ] ;
21
24
/** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
@@ -58,8 +61,10 @@ export class Subject<T> extends Observable<T> implements SubscriptionLike {
58
61
errorContext ( ( ) => {
59
62
this . _throwIfClosed ( ) ;
60
63
if ( ! this . isStopped ) {
61
- const copy = this . observers . slice ( ) ;
62
- for ( const observer of copy ) {
64
+ if ( ! this . currentObservers ) {
65
+ this . currentObservers = Array . from ( this . observers ) ;
66
+ }
67
+ for ( const observer of this . currentObservers ) {
63
68
observer . next ( value ) ;
64
69
}
65
70
}
@@ -95,7 +100,7 @@ export class Subject<T> extends Observable<T> implements SubscriptionLike {
95
100
96
101
unsubscribe ( ) {
97
102
this . isStopped = this . closed = true ;
98
- this . observers = null ! ;
103
+ this . observers = this . currentObservers = null ! ;
99
104
}
100
105
101
106
get observed ( ) {
@@ -118,9 +123,15 @@ export class Subject<T> extends Observable<T> implements SubscriptionLike {
118
123
/** @internal */
119
124
protected _innerSubscribe ( subscriber : Subscriber < any > ) {
120
125
const { hasError, isStopped, observers } = this ;
121
- return hasError || isStopped
122
- ? EMPTY_SUBSCRIPTION
123
- : ( observers . push ( subscriber ) , new Subscription ( ( ) => arrRemove ( observers , subscriber ) ) ) ;
126
+ if ( hasError || isStopped ) {
127
+ return EMPTY_SUBSCRIPTION ;
128
+ }
129
+ this . currentObservers = null ;
130
+ observers . push ( subscriber ) ;
131
+ return new Subscription ( ( ) => {
132
+ this . currentObservers = null ;
133
+ arrRemove ( observers , subscriber ) ;
134
+ } ) ;
124
135
}
125
136
126
137
/** @internal */
0 commit comments