Skip to content

Commit a251657

Browse files
committed
node: mark promises as handled as soon as possible
Fixes: #1912 PR-URL: #1952 Reviewed-By: Domenic Denicola <[email protected]> Reviewed-By: Petka Antonov <[email protected]>
1 parent 03ce84d commit a251657

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

src/node.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -515,18 +515,20 @@
515515
var hasBeenNotified = hasBeenNotifiedProperty.get(promise);
516516
if (hasBeenNotified !== undefined) {
517517
hasBeenNotifiedProperty.delete(promise);
518-
if (hasBeenNotified === true)
519-
process.emit('rejectionHandled', promise);
518+
if (hasBeenNotified === true) {
519+
process.nextTick(function() {
520+
process.emit('rejectionHandled', promise);
521+
});
522+
}
523+
520524
}
521525
}
522526

523527
process._setupPromises(function(event, promise, reason) {
524528
if (event === promiseRejectEvent.unhandled)
525529
unhandledRejection(promise, reason);
526530
else if (event === promiseRejectEvent.handled)
527-
process.nextTick(function() {
528-
rejectionHandled(promise);
529-
});
531+
rejectionHandled(promise);
530532
else
531533
NativeModule.require('assert').fail('unexpected PromiseRejectEvent');
532534
});

test/parallel/test-promises-unhandled-rejections.js

+15
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,21 @@ asyncTest('Attaching a promise catch in a process.nextTick is soon enough to' +
275275
});
276276
});
277277

278+
asyncTest('While inside setImmediate, catching a rejected promise derived ' +
279+
'from returning a rejected promise in a fulfillment handler ' +
280+
'prevents unhandledRejection', function(done) {
281+
onUnhandledFail(done);
282+
283+
setImmediate(function() {
284+
// reproduces on first tick and inside of setImmediate
285+
Promise
286+
.resolve('resolve')
287+
.then(function() {
288+
return Promise.reject('reject');
289+
}).catch(function(e) {});
290+
});
291+
});
292+
278293
// State adapation tests
279294
asyncTest('catching a promise which is asynchronously rejected (via' +
280295
'resolution to an asynchronously-rejected promise) prevents' +

0 commit comments

Comments
 (0)