Index: src/promise.js |
diff --git a/src/promise.js b/src/promise.js |
index 37c10ec08eb298d5543738531168fe0315ca7854..ca9bc25f279ee45c48ce00f39af736de1b4d15c5 100644 |
--- a/src/promise.js |
+++ b/src/promise.js |
@@ -30,7 +30,7 @@ var promiseValue = GLOBAL_PRIVATE("Promise#value"); |
var promiseOnResolve = GLOBAL_PRIVATE("Promise#onResolve"); |
var promiseOnReject = GLOBAL_PRIVATE("Promise#onReject"); |
var promiseRaw = GLOBAL_PRIVATE("Promise#raw"); |
-var promiseDebug = GLOBAL_PRIVATE("Promise#debug"); |
+var promiseHasReject = GLOBAL_PRIVATE("Promise#hasReject"); |
var lastMicrotaskId = 0; |
(function() { |
@@ -159,11 +159,8 @@ var lastMicrotaskId = 0; |
PromiseReject = function PromiseReject(promise, r) { |
// Check promise status to confirm that this reject has an effect. |
- // Check promiseDebug property to avoid duplicate event. |
- if (DEBUG_IS_ACTIVE && |
- GET_PRIVATE(promise, promiseStatus) == 0 && |
- !HAS_DEFINED_PRIVATE(promise, promiseDebug)) { |
- %DebugPromiseRejectEvent(promise, r); |
+ if (GET_PRIVATE(promise, promiseStatus) == 0) { |
+ %PromiseRejectEvent(promise, r); |
} |
PromiseDone(promise, -1, r, promiseOnReject) |
} |
@@ -213,6 +210,10 @@ var lastMicrotaskId = 0; |
// flatMap |
onResolve = IS_UNDEFINED(onResolve) ? PromiseIdResolveHandler : onResolve; |
onReject = IS_UNDEFINED(onReject) ? PromiseIdRejectHandler : onReject; |
+ if (onReject != PromiseIdRejectHandler) { |
+ // Mark this promise as having reject handler. |
+ SET_PRIVATE(this, promiseHasReject, true); |
+ } |
var deferred = %_CallFunction(this.constructor, PromiseDeferred); |
switch (GET_PRIVATE(this, promiseStatus)) { |
case UNDEFINED: |
@@ -326,20 +327,18 @@ var lastMicrotaskId = 0; |
// Utility for debugger |
function PromiseHasRejectHandlerRecursive(promise) { |
+ if (GET_PRIVATE(promise, promiseHasReject)) return true; |
var queue = GET_PRIVATE(promise, promiseOnReject); |
if (IS_UNDEFINED(queue)) return false; |
- // Do a depth first search for a reject handler that's not |
- // the default PromiseIdRejectHandler. |
+ // Do a depth first search for a promise that has been marked as having |
+ // a reject handler. |
for (var i = 0; i < queue.length; i += 2) { |
- if (queue[i] != PromiseIdRejectHandler) return true; |
if (PromiseHasRejectHandlerRecursive(queue[i + 1].promise)) return true; |
} |
return false; |
} |
PromiseHasRejectHandler = function PromiseHasRejectHandler() { |
- // Mark promise as already having triggered a reject event. |
- SET_PRIVATE(this, promiseDebug, true); |
return PromiseHasRejectHandlerRecursive(this); |
}; |