diff --git a/lib/es6-promise/-internal.js b/lib/es6-promise/-internal.js index 925776f..cea046a 100644 --- a/lib/es6-promise/-internal.js +++ b/lib/es6-promise/-internal.js @@ -28,15 +28,6 @@ function cannotReturnOwn() { return new TypeError('A promises callback cannot return that same promise.'); } -function getThen(promise) { - try { - return promise.then; - } catch(error) { - TRY_CATCH_ERROR.error = error; - return TRY_CATCH_ERROR; - } -} - function tryThen(then, value, fulfillmentHandler, rejectionHandler) { try { then.call(value, fulfillmentHandler, rejectionHandler); @@ -104,7 +95,14 @@ function resolve(promise, value) { if (promise === value) { reject(promise, selfFulfillment()); } else if (objectOrFunction(value)) { - handleMaybeThenable(promise, value, getThen(value)); + let then; + try { + then = value.then; + } catch (error) { + reject(promise, error); + return; + } + handleMaybeThenable(promise, value, then); } else { fulfill(promise, value); } @@ -249,7 +247,6 @@ function makePromise(promise) { export { nextId, makePromise, - getThen, noop, resolve, reject, diff --git a/lib/es6-promise/enumerator.js b/lib/es6-promise/enumerator.js index b0eaa93..be2e093 100644 --- a/lib/es6-promise/enumerator.js +++ b/lib/es6-promise/enumerator.js @@ -10,7 +10,6 @@ import { FULFILLED, REJECTED, PENDING, - getThen, handleMaybeThenable } from './-internal'; @@ -63,7 +62,15 @@ export default class Enumerator { let { resolve } = c; if (resolve === originalResolve) { - let then = getThen(entry); + let then; + let error; + let didError = false; + try { + then = entry.then; + } catch (e) { + didError = true; + error = e; + } if (then === originalThen && entry._state !== PENDING) { @@ -73,7 +80,11 @@ export default class Enumerator { this._result[i] = entry; } else if (c === Promise) { let promise = new c(noop); - handleMaybeThenable(promise, entry, then); + if (didError) { + reject(promise, error); + } else { + handleMaybeThenable(promise, entry, then); + } this._willSettleAt(promise, i); } else { this._willSettleAt(new c(resolve => resolve(entry)), i);