--- title: Use after() for Non-Blocking Operations impact: MEDIUM impactDescription: faster response times tags: server, async, logging, analytics, side-effects --- ## Use after() for Non-Blocking Operations Use Next.js's `after()` to schedule work that should execute after a response is sent. This prevents logging, analytics, and other side effects from blocking the response. **Incorrect (blocks response):** ```tsx import { logUserAction } from "@/app/utils"; export async function POST(request: Request) { // Perform mutation await updateDatabase(request); // Logging blocks the response const userAgent = request.headers.get("user-agent") || "unknown"; await logUserAction({ userAgent }); return new Response(JSON.stringify({ status: "success" }), { status: 200, headers: { "Content-Type": "application/json" }, }); } ``` **Correct (non-blocking):** ```tsx import { after } from "next/server"; import { headers, cookies } from "next/headers"; import { logUserAction } from "@/app/utils"; export async function POST(request: Request) { // Perform mutation await updateDatabase(request); // Log after response is sent after(async () => { const userAgent = (await headers()).get("user-agent") || "unknown"; const sessionCookie = (await cookies()).get("session-id")?.value || "anonymous"; logUserAction({ sessionCookie, userAgent }); }); return new Response(JSON.stringify({ status: "success" }), { status: 200, headers: { "Content-Type": "application/json" }, }); } ``` The response is sent immediately while logging happens in the background. **Common use cases:** - Analytics tracking - Audit logging - Sending notifications - Cache invalidation - Cleanup tasks **Important notes:** - `after()` runs even if the response fails or redirects - Works in Server Actions, Route Handlers, and Server Components Reference: [https://nextjs.org/docs/app/api-reference/functions/after](https://nextjs.org/docs/app/api-reference/functions/after)