Skip to content

Commit 21e755a

Browse files
authored
Merge pull request #345 from stefanpenner/remove-try-catch-hacks
Remove try/catch avoidance hacks
2 parents 9869a4b + e33ab9d commit 21e755a

File tree

2 files changed

+32
-44
lines changed

2 files changed

+32
-44
lines changed

lib/es6-promise/-internal.js

Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ const PENDING = void 0;
1818
const FULFILLED = 1;
1919
const REJECTED = 2;
2020

21-
const TRY_CATCH_ERROR = { error: null };
22-
2321
function selfFulfillment() {
2422
return new TypeError("You cannot resolve a promise with itself");
2523
}
@@ -28,15 +26,6 @@ function cannotReturnOwn() {
2826
return new TypeError('A promises callback cannot return that same promise.');
2927
}
3028

31-
function getThen(promise) {
32-
try {
33-
return promise.then;
34-
} catch(error) {
35-
TRY_CATCH_ERROR.error = error;
36-
return TRY_CATCH_ERROR;
37-
}
38-
}
39-
4029
function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
4130
try {
4231
then.call(value, fulfillmentHandler, rejectionHandler);
@@ -47,8 +36,8 @@ function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
4736

4837
function handleForeignThenable(promise, thenable, then) {
4938
asap(promise => {
50-
var sealed = false;
51-
var error = tryThen(then, thenable, value => {
39+
let sealed = false;
40+
let error = tryThen(then, thenable, value => {
5241
if (sealed) { return; }
5342
sealed = true;
5443
if (thenable !== value) {
@@ -87,10 +76,7 @@ function handleMaybeThenable(promise, maybeThenable, then) {
8776
maybeThenable.constructor.resolve === originalResolve) {
8877
handleOwnThenable(promise, maybeThenable);
8978
} else {
90-
if (then === TRY_CATCH_ERROR) {
91-
reject(promise, TRY_CATCH_ERROR.error);
92-
TRY_CATCH_ERROR.error = null;
93-
} else if (then === undefined) {
79+
if (then === undefined) {
9480
fulfill(promise, maybeThenable);
9581
} else if (isFunction(then)) {
9682
handleForeignThenable(promise, maybeThenable, then);
@@ -104,7 +90,14 @@ function resolve(promise, value) {
10490
if (promise === value) {
10591
reject(promise, selfFulfillment());
10692
} else if (objectOrFunction(value)) {
107-
handleMaybeThenable(promise, value, getThen(value));
93+
let then;
94+
try {
95+
then = value.then;
96+
} catch (error) {
97+
reject(promise, error);
98+
return;
99+
}
100+
handleMaybeThenable(promise, value, then);
108101
} else {
109102
fulfill(promise, value);
110103
}
@@ -174,46 +167,31 @@ function publish(promise) {
174167
promise._subscribers.length = 0;
175168
}
176169

177-
178-
function tryCatch(callback, detail) {
179-
try {
180-
return callback(detail);
181-
} catch(e) {
182-
TRY_CATCH_ERROR.error = e;
183-
return TRY_CATCH_ERROR;
184-
}
185-
}
186-
187170
function invokeCallback(settled, promise, callback, detail) {
188171
let hasCallback = isFunction(callback),
189-
value, error, succeeded, failed;
172+
value, error, succeeded = true;
190173

191174
if (hasCallback) {
192-
value = tryCatch(callback, detail);
193-
194-
if (value === TRY_CATCH_ERROR) {
195-
failed = true;
196-
error = value.error;
197-
value.error = null;
198-
} else {
199-
succeeded = true;
175+
try {
176+
value = callback(detail);
177+
} catch (e) {
178+
succeeded = false;
179+
error = e;
200180
}
201181

202182
if (promise === value) {
203183
reject(promise, cannotReturnOwn());
204184
return;
205185
}
206-
207186
} else {
208187
value = detail;
209-
succeeded = true;
210188
}
211189

212190
if (promise._state !== PENDING) {
213191
// noop
214192
} else if (hasCallback && succeeded) {
215193
resolve(promise, value);
216-
} else if (failed) {
194+
} else if (succeeded === false) {
217195
reject(promise, error);
218196
} else if (settled === FULFILLED) {
219197
fulfill(promise, value);
@@ -249,7 +227,6 @@ function makePromise(promise) {
249227
export {
250228
nextId,
251229
makePromise,
252-
getThen,
253230
noop,
254231
resolve,
255232
reject,

lib/es6-promise/enumerator.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
FULFILLED,
1111
REJECTED,
1212
PENDING,
13-
getThen,
1413
handleMaybeThenable
1514
} from './-internal';
1615

@@ -63,7 +62,15 @@ export default class Enumerator {
6362
let { resolve } = c;
6463

6564
if (resolve === originalResolve) {
66-
let then = getThen(entry);
65+
let then;
66+
let error;
67+
let didError = false;
68+
try {
69+
then = entry.then;
70+
} catch (e) {
71+
didError = true;
72+
error = e;
73+
}
6774

6875
if (then === originalThen &&
6976
entry._state !== PENDING) {
@@ -73,7 +80,11 @@ export default class Enumerator {
7380
this._result[i] = entry;
7481
} else if (c === Promise) {
7582
let promise = new c(noop);
76-
handleMaybeThenable(promise, entry, then);
83+
if (didError) {
84+
reject(promise, error);
85+
} else {
86+
handleMaybeThenable(promise, entry, then);
87+
}
7788
this._willSettleAt(promise, i);
7889
} else {
7990
this._willSettleAt(new c(resolve => resolve(entry)), i);

0 commit comments

Comments
 (0)