unstable_after
unstable_after()
allows you to schedule work to be executed after a response is finished. This is useful for tasks and other side effects that should not block the response, such as logging and analytics.
It can be used in Server Components (including generateMetadata
), Server Actions, Route Handlers, and Middleware.
To use unstable_after()
, you need to enable it using the experimental.after
config in the next.config.js
file:
const nextConfig = {
experimental: {
after: true,
},
}
module.exports = nextConfig
The function accepts a callback that will be executed after the response is finished:
import { unstable_after as after } from 'next/server'
import { log } from '@/app/utils'
export default function Layout({ children }: { children: React.ReactNode }) {
after(() => {
// Execute after the layout is rendered and sent to the user
log()
})
return <>{children}</>
}
import { unstable_after as after } from 'next/server'
import { log } from '@/app/utils'
export default function Layout({ children }) {
after(() => {
// Execute after the layout is rendered and sent to the user
log()
})
return <>{children}</>
}
Good to know:
unstable_after()
will be executed even if the response didn't complete successfully. Including when an error is thrown or whennotFound()
orredirect()
is called.unstable_after()
is a dynamic function that will opt a route into dynamic rendering. This behavior can be overridden with theexport dynamic = "force-static"
segment config.- You can use React
cache
to deduplicate functions called insideunstable_after()
.cookies()
cannot be set insideunstable_after()
since the response has already been sent.unstable_after()
can be nested inside otherunstable_after()
calls.
Parameters​
- A callback function which will be executed after the response is finished.
Returns​
unstable_after()
does not return a value.
Alternatives​
The use case for unstable_after()
is to process secondary tasks without blocking the primary response. It's similar to using the platform's waitUntil()
or removing await
from a promise, but with the following differences:
waitUntil()
: accepts a promise and enqueues a task to be executed during the lifecycle of the request, whereasunstable_after()
accepts a callback that will be executed after the response is finished.- Removing
await
: starts executing during the response, which uses resources. It's also not reliable in serverless environments as the function stops computation immediately after the response is sent, potentially interrupting the task.
We recommend using unstable_after()
as it has been designed to consider other Next.js APIs and contexts.
Serverless function duration​
unstable_after()
will run for the platform's default or configured max duration of a serverless function. If your platform supports it, you can configure the timeout limit using the maxDuration
route segment config.