diff --git a/packages/next/src/server/app-render/app-render-prerender-utils.ts b/packages/next/src/server/app-render/app-render-prerender-utils.ts index 3a8f1895949bf..c321c9757e376 100644 --- a/packages/next/src/server/app-render/app-render-prerender-utils.ts +++ b/packages/next/src/server/app-render/app-render-prerender-utils.ts @@ -7,7 +7,7 @@ import { isPrerenderInterruptedError } from './dynamic-rendering' */ export function prerenderAndAbortInSequentialTasks( prerender: () => Promise, - abort: () => void + abort: () => Promise ): Promise { if (process.env.NEXT_RUNTIME === 'edge') { throw new InvariantError( @@ -26,7 +26,8 @@ export function prerenderAndAbortInSequentialTasks( }) setImmediate(() => { abort() - resolve(pendingResult) + .then(() => resolve(pendingResult)) + .catch(() => {}) }) }) } diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index b2f1c276c0157..dc84435b1259d 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -2708,7 +2708,7 @@ async function prerenderToStream( implicitTags: implicitTags, renderSignal: initialClientController.signal, controller: initialClientController, - cacheSignal: null, + cacheSignal, dynamicTracking: null, revalidate: INFINITE_CACHE, expire: INFINITE_CACHE, @@ -2761,7 +2761,8 @@ async function prerenderToStream( : [bootstrapScript], } ), - () => { + async () => { + await cacheSignal.cacheReady() initialClientController.abort() } ).catch((err) => { @@ -2833,7 +2834,7 @@ async function prerenderToStream( prerenderIsPending = false return prerenderResult }, - () => { + async () => { if (finalServerController.signal.aborted) { // If the server controller is already aborted we must have called something // that required aborting the prerender synchronously such as with new Date() @@ -2927,7 +2928,7 @@ async function prerenderToStream( : [bootstrapScript], } ), - () => { + async () => { finalClientController.abort() } )