aboutsummaryrefslogtreecommitdiff
path: root/node_modules/core-js/modules/es6.promise.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/core-js/modules/es6.promise.js')
-rw-r--r--node_modules/core-js/modules/es6.promise.js21
1 files changed, 17 insertions, 4 deletions
diff --git a/node_modules/core-js/modules/es6.promise.js b/node_modules/core-js/modules/es6.promise.js
index 88bf65d4c..b0ff3bfcf 100644
--- a/node_modules/core-js/modules/es6.promise.js
+++ b/node_modules/core-js/modules/es6.promise.js
@@ -13,10 +13,13 @@ var task = require('./_task').set;
var microtask = require('./_microtask')();
var newPromiseCapabilityModule = require('./_new-promise-capability');
var perform = require('./_perform');
+var userAgent = require('./_user-agent');
var promiseResolve = require('./_promise-resolve');
var PROMISE = 'Promise';
var TypeError = global.TypeError;
var process = global.process;
+var versions = process && process.versions;
+var v8 = versions && versions.v8 || '';
var $Promise = global[PROMISE];
var isNode = classof(process) == 'process';
var empty = function () { /* empty */ };
@@ -31,7 +34,13 @@ var USE_NATIVE = !!function () {
exec(empty, empty);
};
// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
- return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
+ return (isNode || typeof PromiseRejectionEvent == 'function')
+ && promise.then(empty) instanceof FakePromise
+ // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // we can't detect it synchronously, so just check versions
+ && v8.indexOf('6.6') !== 0
+ && userAgent.indexOf('Chrome/66') === -1;
} catch (e) { /* empty */ }
}();
@@ -53,7 +62,7 @@ var notify = function (promise, isReject) {
var resolve = reaction.resolve;
var reject = reaction.reject;
var domain = reaction.domain;
- var result, then;
+ var result, then, exited;
try {
if (handler) {
if (!ok) {
@@ -63,8 +72,11 @@ var notify = function (promise, isReject) {
if (handler === true) result = value;
else {
if (domain) domain.enter();
- result = handler(value);
- if (domain) domain.exit();
+ result = handler(value); // may throw
+ if (domain) {
+ domain.exit();
+ exited = true;
+ }
}
if (result === reaction.promise) {
reject(TypeError('Promise-chain cycle'));
@@ -73,6 +85,7 @@ var notify = function (promise, isReject) {
} else resolve(result);
} else reject(value);
} catch (e) {
+ if (domain && !exited) domain.exit();
reject(e);
}
};