Skip to content

Commit 2e73413

Browse files
committed
slightly rework Subscription state
1 parent bbddc65 commit 2e73413

File tree

1 file changed

+49
-47
lines changed

1 file changed

+49
-47
lines changed

packages/core-js/modules/esnext.observable.js

+49-47
Original file line numberDiff line numberDiff line change
@@ -32,47 +32,49 @@ var getSubscriptionInternalState = getterFor(SUBSCRIPTION);
3232
var getSubscriptionObserverInternalState = getterFor(SUBSCRIPTION_OBSERVER);
3333
var Array = global.Array;
3434

35-
var cleanupSubscription = function (subscriptionState) {
36-
var cleanup = subscriptionState.cleanup;
37-
if (cleanup) {
38-
subscriptionState.cleanup = undefined;
39-
try {
40-
cleanup();
41-
} catch (error) {
42-
hostReportErrors(error);
43-
}
44-
}
45-
};
46-
47-
var subscriptionClosed = function (subscriptionState) {
48-
return subscriptionState.observer === undefined;
35+
var SubscriptionState = function (observer) {
36+
this.observer = anObject(observer);
37+
this.cleanup = undefined;
38+
this.subscriptionObserver = undefined;
4939
};
5040

51-
var close = function (subscriptionState) {
52-
var subscription = subscriptionState.facade;
53-
if (!DESCRIPTORS) {
54-
subscription.closed = true;
55-
var subscriptionObserver = subscriptionState.subscriptionObserver;
56-
if (subscriptionObserver) subscriptionObserver.closed = true;
57-
} subscriptionState.observer = undefined;
41+
SubscriptionState.prototype = {
42+
type: SUBSCRIPTION,
43+
clean: function () {
44+
var cleanup = this.cleanup;
45+
if (cleanup) {
46+
this.cleanup = undefined;
47+
try {
48+
cleanup();
49+
} catch (error) {
50+
hostReportErrors(error);
51+
}
52+
}
53+
},
54+
close: function () {
55+
if (!DESCRIPTORS) {
56+
var subscription = this.facade;
57+
var subscriptionObserver = this.subscriptionObserver;
58+
subscription.closed = true;
59+
if (subscriptionObserver) subscriptionObserver.closed = true;
60+
} this.observer = undefined;
61+
},
62+
isClosed: function () {
63+
return this.observer === undefined;
64+
}
5865
};
5966

6067
var Subscription = function (observer, subscriber) {
61-
var subscriptionState = setInternalState(this, {
62-
type: SUBSCRIPTION,
63-
cleanup: undefined,
64-
observer: anObject(observer),
65-
subscriptionObserver: undefined
66-
});
68+
var subscriptionState = setInternalState(this, new SubscriptionState(observer));
6769
var start;
6870
if (!DESCRIPTORS) this.closed = false;
6971
try {
7072
if (start = getMethod(observer, 'start')) call(start, observer, this);
7173
} catch (error) {
7274
hostReportErrors(error);
7375
}
74-
if (subscriptionClosed(subscriptionState)) return;
75-
var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(this);
76+
if (subscriptionState.isClosed()) return;
77+
var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(subscriptionState);
7678
try {
7779
var cleanup = subscriber(subscriptionObserver);
7880
var subscription = cleanup;
@@ -82,38 +84,38 @@ var Subscription = function (observer, subscriber) {
8284
} catch (error) {
8385
subscriptionObserver.error(error);
8486
return;
85-
} if (subscriptionClosed(subscriptionState)) cleanupSubscription(subscriptionState);
87+
} if (subscriptionState.isClosed()) subscriptionState.clean();
8688
};
8789

8890
Subscription.prototype = redefineAll({}, {
8991
unsubscribe: function unsubscribe() {
9092
var subscriptionState = getSubscriptionInternalState(this);
91-
if (!subscriptionClosed(subscriptionState)) {
92-
close(subscriptionState);
93-
cleanupSubscription(subscriptionState);
93+
if (!subscriptionState.isClosed()) {
94+
subscriptionState.close();
95+
subscriptionState.clean();
9496
}
9597
}
9698
});
9799

98100
if (DESCRIPTORS) defineProperty(Subscription.prototype, 'closed', {
99101
configurable: true,
100102
get: function () {
101-
return subscriptionClosed(getSubscriptionInternalState(this));
103+
return getSubscriptionInternalState(this).isClosed();
102104
}
103105
});
104106

105-
var SubscriptionObserver = function (subscription) {
107+
var SubscriptionObserver = function (subscriptionState) {
106108
setInternalState(this, {
107109
type: SUBSCRIPTION_OBSERVER,
108-
subscription: subscription
110+
subscriptionState: subscriptionState
109111
});
110112
if (!DESCRIPTORS) this.closed = false;
111113
};
112114

113115
SubscriptionObserver.prototype = redefineAll({}, {
114116
next: function next(value) {
115-
var subscriptionState = getSubscriptionInternalState(getSubscriptionObserverInternalState(this).subscription);
116-
if (!subscriptionClosed(subscriptionState)) {
117+
var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;
118+
if (!subscriptionState.isClosed()) {
117119
var observer = subscriptionState.observer;
118120
try {
119121
var nextMethod = getMethod(observer, 'next');
@@ -124,38 +126,38 @@ SubscriptionObserver.prototype = redefineAll({}, {
124126
}
125127
},
126128
error: function error(value) {
127-
var subscriptionState = getSubscriptionInternalState(getSubscriptionObserverInternalState(this).subscription);
128-
if (!subscriptionClosed(subscriptionState)) {
129+
var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;
130+
if (!subscriptionState.isClosed()) {
129131
var observer = subscriptionState.observer;
130-
close(subscriptionState);
132+
subscriptionState.close();
131133
try {
132134
var errorMethod = getMethod(observer, 'error');
133135
if (errorMethod) call(errorMethod, observer, value);
134136
else hostReportErrors(value);
135137
} catch (err) {
136138
hostReportErrors(err);
137-
} cleanupSubscription(subscriptionState);
139+
} subscriptionState.clean();
138140
}
139141
},
140142
complete: function complete() {
141-
var subscriptionState = getSubscriptionInternalState(getSubscriptionObserverInternalState(this).subscription);
142-
if (!subscriptionClosed(subscriptionState)) {
143+
var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;
144+
if (!subscriptionState.isClosed()) {
143145
var observer = subscriptionState.observer;
144-
close(subscriptionState);
146+
subscriptionState.close();
145147
try {
146148
var completeMethod = getMethod(observer, 'complete');
147149
if (completeMethod) call(completeMethod, observer);
148150
} catch (error) {
149151
hostReportErrors(error);
150-
} cleanupSubscription(subscriptionState);
152+
} subscriptionState.clean();
151153
}
152154
}
153155
});
154156

155157
if (DESCRIPTORS) defineProperty(SubscriptionObserver.prototype, 'closed', {
156158
configurable: true,
157159
get: function () {
158-
return subscriptionClosed(getSubscriptionInternalState(getSubscriptionObserverInternalState(this).subscription));
160+
return getSubscriptionObserverInternalState(this).subscriptionState.isClosed();
159161
}
160162
});
161163

0 commit comments

Comments
 (0)