diff --git a/packages/core/src/pending_tasks.ts b/packages/core/src/pending_tasks.ts index 1d3b1020c67c..cfa2a13baa76 100644 --- a/packages/core/src/pending_tasks.ts +++ b/packages/core/src/pending_tasks.ts @@ -75,7 +75,12 @@ export class PendingTasks { */ run(fn: () => Promise): void { const removeTask = this.add(); - fn().catch(this.errorHandler).finally(removeTask); + try { + fn().catch(this.errorHandler).finally(removeTask); + } catch (err) { + this.errorHandler(err); + removeTask(); + } } /** @nocollapse */ diff --git a/packages/core/test/acceptance/pending_tasks_spec.ts b/packages/core/test/acceptance/pending_tasks_spec.ts index be6220f5ce8c..93f58308c44f 100644 --- a/packages/core/test/acceptance/pending_tasks_spec.ts +++ b/packages/core/test/acceptance/pending_tasks_spec.ts @@ -116,6 +116,24 @@ describe('public PendingTasks', () => { await expectAsync(appRef.whenStable()).toBeResolved(); expect(spy).toHaveBeenCalled(); }); + + it('should stop blocking stability if run function throws synchronously', async () => { + TestBed.configureTestingModule({ + rethrowApplicationErrors: false, + }); + + const appRef = TestBed.inject(ApplicationRef); + const pendingTasks = TestBed.inject(PendingTasks); + const errorHandler = TestBed.inject(ErrorHandler); + const spy = spyOn(errorHandler, 'handleError'); + + pendingTasks.run(() => { + throw new Error('Sync error'); + }); + await expectAsync(appRef.whenStable()).toBeResolved(); + expect(spy).toHaveBeenCalled(); + expect(spy.calls.mostRecent().args[0].message).toContain('Sync error'); + }); }); function applicationRefIsStable(applicationRef: ApplicationRef) {