fix(scheduler): recover nextTick from error in post flush cb

This commit is contained in:
Evan You 2024-12-09 18:35:28 +08:00
parent 2b05c1e906
commit 2bbb6d2fc5
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 19 additions and 3 deletions

View File

@ -844,4 +844,12 @@ describe('scheduler', () => {
await nextTick()
expect(calls).toEqual(['cb2', 'cb1'])
})
test('error in postFlush cb should not cause nextTick to stuck in rejected state forever', async () => {
queuePostFlushCb(() => {
throw 'err'
})
await expect(nextTick).rejects.toThrow('err')
await expect(nextTick()).resolves.toBeUndefined()
})
})

View File

@ -119,7 +119,10 @@ export function queueJob(job: SchedulerJob): void {
function queueFlush() {
if (!currentFlushPromise) {
currentFlushPromise = resolvedPromise.then(flushJobs)
currentFlushPromise = resolvedPromise.then(flushJobs).catch(e => {
currentFlushPromise = null
throw e
})
}
}
@ -201,8 +204,13 @@ export function flushPostFlushCbs(seen?: CountMap): void {
if (cb.flags! & SchedulerJobFlags.ALLOW_RECURSE) {
cb.flags! &= ~SchedulerJobFlags.QUEUED
}
if (!(cb.flags! & SchedulerJobFlags.DISPOSED)) cb()
cb.flags! &= ~SchedulerJobFlags.QUEUED
if (!(cb.flags! & SchedulerJobFlags.DISPOSED)) {
try {
cb()
} finally {
cb.flags! &= ~SchedulerJobFlags.QUEUED
}
}
}
activePostFlushCbs = null
postFlushIndex = 0