Skip to content

Commit c7542a1

Browse files
JiaLiPassionmhevery
authored andcommitted
fix(zone.js): don't fire unhandledrejection if Zone handled error (#31718)
Close #31701 PR Close #31718
1 parent 2172368 commit c7542a1

2 files changed

Lines changed: 84 additions & 1 deletion

File tree

packages/zone.js/lib/extra/bluebird.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,40 @@ Zone.__load_patch('bluebird', (global: any, Zone: ZoneType, api: _ZonePrivate) =
4141
});
4242
});
4343

44+
if (typeof window !== 'undefined') {
45+
window.addEventListener('unhandledrejection', function(event: any) {
46+
const error = event.detail && event.detail.reason;
47+
if (error && error.isHandledByZone) {
48+
event.preventDefault();
49+
if (typeof event.stopImmediatePropagation === 'function') {
50+
event.stopImmediatePropagation();
51+
}
52+
}
53+
});
54+
} else if (typeof process !== 'undefined') {
55+
process.on('unhandledRejection', (reason: any, p: any) => {
56+
if (reason && reason.isHandledByZone) {
57+
const listeners = process.listeners('unhandledRejection');
58+
if (listeners) {
59+
// remove unhandledRejection listeners so the callback
60+
// will not be triggered.
61+
process.removeAllListeners('unhandledRejection');
62+
process.nextTick(() => {
63+
listeners.forEach(listener => process.on('unhandledRejection', listener));
64+
});
65+
}
66+
}
67+
});
68+
}
69+
4470
Bluebird.onPossiblyUnhandledRejection(function(e: any, promise: any) {
4571
try {
46-
Zone.current.runGuarded(() => { throw e; });
72+
Zone.current.runGuarded(() => {
73+
e.isHandledByZone = true;
74+
throw e;
75+
});
4776
} catch (err) {
77+
err.isHandledByZone = false;
4878
api.onUnhandledError(err);
4979
}
5080
});

packages/zone.js/test/extra/bluebird.spec.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,4 +700,57 @@ describe('bluebird promise', () => {
700700

701701
zone.runGuarded(() => { return Promise.resolve().then(() => { throw new Error('test'); }); });
702702
});
703+
704+
it('should not trigger unhandledrejection if zone.onHandleError return false', (done: DoneFn) => {
705+
const listener = function() { fail('should not be here'); };
706+
707+
if (typeof window !== 'undefined') {
708+
window.addEventListener('unhandledrejection', listener);
709+
} else if (typeof process !== 'undefined') {
710+
process.on('unhandledRejection', listener);
711+
}
712+
713+
const zone = Zone.current.fork({
714+
name: 'testErrorHandling',
715+
onHandleError: function() {
716+
setTimeout(() => {
717+
if (typeof window !== 'undefined') {
718+
window.removeEventListener('unhandledrejection', listener);
719+
} else if (typeof process !== 'undefined') {
720+
process.removeListener('unhandledRejection', listener);
721+
}
722+
done();
723+
}, 500);
724+
return false;
725+
}
726+
});
727+
728+
zone.runGuarded(() => { return Promise.resolve().then(() => { throw new Error('test'); }); });
729+
});
730+
731+
it('should trigger unhandledrejection if zone.onHandleError return true', (done: DoneFn) => {
732+
const listener = function(event: any) {
733+
if (typeof window !== 'undefined') {
734+
expect(event.detail.reason.message).toEqual('test');
735+
} else if (typeof process !== 'undefined') {
736+
expect(event.message).toEqual('test');
737+
}
738+
if (typeof window !== 'undefined') {
739+
window.removeEventListener('unhandledrejection', listener);
740+
} else if (typeof process !== 'undefined') {
741+
process.removeListener('unhandledRejection', listener);
742+
}
743+
done();
744+
};
745+
if (typeof window !== 'undefined') {
746+
window.addEventListener('unhandledrejection', listener);
747+
} else if (typeof process !== 'undefined') {
748+
process.on('unhandledRejection', listener);
749+
}
750+
751+
const zone =
752+
Zone.current.fork({name: 'testErrorHandling', onHandleError: function() { return true; }});
753+
754+
zone.runGuarded(() => { return Promise.resolve().then(() => { throw new Error('test'); }); });
755+
});
703756
});

0 commit comments

Comments
 (0)