Skip to content

Commit 867e3a0

Browse files
committed
src: skip JS callback for settled Promise.race losers
this was Co-Authored-By: Felipe Coelho <felipecoelho.ness@gmail.com>
1 parent 155d4f0 commit 867e3a0

2 files changed

Lines changed: 7 additions & 19 deletions

File tree

lib/internal/process/promises.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ const {
1414
promiseRejectEvents: {
1515
kPromiseRejectWithNoHandler,
1616
kPromiseHandlerAddedAfterReject,
17-
kPromiseRejectAfterResolved,
18-
kPromiseResolveAfterResolved,
1917
},
2018
setPromiseRejectCallback,
2119
} = internalBinding('task_queue');
@@ -161,21 +159,15 @@ function promiseRejectHandler(type, promise, reason) {
161159
if (unhandledRejectionsMode === undefined) {
162160
unhandledRejectionsMode = getUnhandledRejectionsMode();
163161
}
162+
// kPromiseRejectAfterResolved and kPromiseResolveAfterResolved are
163+
// filtered out in C++ (src/node_task_queue.cc) and never reach JS.
164164
switch (type) {
165165
case kPromiseRejectWithNoHandler: // 0
166166
unhandledRejection(promise, reason);
167167
break;
168168
case kPromiseHandlerAddedAfterReject: // 1
169169
handledRejection(promise);
170170
break;
171-
case kPromiseRejectAfterResolved: // 2
172-
// Do nothing in this case. Previous we would emit a multipleResolves
173-
// event but that was deprecated then later removed.
174-
break;
175-
case kPromiseResolveAfterResolved: // 3
176-
// Do nothing in this case. Previous we would emit a multipleResolves
177-
// event but that was deprecated then later removed.
178-
break;
179171
}
180172
}
181173

src/node_task_queue.cc

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ using v8::FunctionCallbackInfo;
1919
using v8::Isolate;
2020
using v8::Just;
2121
using v8::kPromiseHandlerAddedAfterReject;
22-
using v8::kPromiseRejectAfterResolved;
2322
using v8::kPromiseRejectWithNoHandler;
24-
using v8::kPromiseResolveAfterResolved;
2523
using v8::Local;
2624
using v8::Maybe;
2725
using v8::Number;
@@ -53,7 +51,11 @@ void PromiseRejectCallback(PromiseRejectMessage message) {
5351

5452
Environment* env = Environment::GetCurrent(isolate);
5553

56-
if (env == nullptr || !env->can_call_into_js()) return;
54+
if (env == nullptr || !env->can_call_into_js() ||
55+
(event != kPromiseRejectWithNoHandler &&
56+
event != kPromiseHandlerAddedAfterReject)) {
57+
return;
58+
}
5759

5860
Local<Function> callback = env->promise_reject_callback();
5961
// The promise is rejected before JS land calls SetPromiseRejectCallback
@@ -77,10 +79,6 @@ void PromiseRejectCallback(PromiseRejectMessage message) {
7779
"rejections",
7880
"unhandled", unhandledRejections,
7981
"handledAfter", rejectionsHandledAfter);
80-
} else if (event == kPromiseResolveAfterResolved) {
81-
value = message.GetValue();
82-
} else if (event == kPromiseRejectAfterResolved) {
83-
value = message.GetValue();
8482
} else {
8583
return;
8684
}
@@ -173,8 +171,6 @@ static void Initialize(Local<Object> target,
173171
Local<Object> events = Object::New(isolate);
174172
NODE_DEFINE_CONSTANT(events, kPromiseRejectWithNoHandler);
175173
NODE_DEFINE_CONSTANT(events, kPromiseHandlerAddedAfterReject);
176-
NODE_DEFINE_CONSTANT(events, kPromiseResolveAfterResolved);
177-
NODE_DEFINE_CONSTANT(events, kPromiseRejectAfterResolved);
178174

179175
target->Set(env->context(),
180176
FIXED_ONE_BYTE_STRING(isolate, "promiseRejectEvents"),

0 commit comments

Comments
 (0)