--- title: cacheSignal --- `cacheSignal` is currently only used with [React Server Components](/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components). `cacheSignal` allows you to know when the `cache()` lifetime is over. ```js const signal = cacheSignal(); ``` --- ## Reference {/*reference*/} ### `cacheSignal` {/*cachesignal*/} Call `cacheSignal` to get an `AbortSignal`. ```js {3,7} import {cacheSignal} from 'react'; async function Component() { await fetch(url, { signal: cacheSignal() }); } ``` When React has finished rendering, the `AbortSignal` will be aborted. This allows you to cancel any in-flight work that is no longer needed. Rendering is considered finished when: - React has successfully completed rendering - the render was aborted - the render has failed #### Parameters {/*parameters*/} This function does not accept any parameters. #### Returns {/*returns*/} `cacheSignal` returns an `AbortSignal` if called during rendering. Otherwise `cacheSignal()` returns `null`. #### Caveats {/*caveats*/} - `cacheSignal` is currently for use in [React Server Components](/reference/rsc/server-components) only. In Client Components, it will always return `null`. In the future it will also be used for Client Component when a client cache refreshes or invalidates. You should not assume it'll always be null on the client. - If called outside of rendering, `cacheSignal` will return `null` to make it clear that the current scope isn't cached forever. --- ## Usage {/*usage*/} ### Cancel in-flight requests {/*cancel-in-flight-requests*/} Call `cacheSignal` to abort in-flight requests. ```js [[1, 4, "cacheSignal()"]] import {cache, cacheSignal} from 'react'; const dedupedFetch = cache(fetch); async function Component() { await dedupedFetch(url, { signal: cacheSignal() }); } ``` You can't use `cacheSignal` to abort async work that was started outside of rendering e.g. ```js import {cacheSignal} from 'react'; // 🚩 Pitfall: The request will not actually be aborted if the rendering of `Component` is finished. const response = fetch(url, { signal: cacheSignal() }); async function Component() { await response; } ``` ### Ignore errors after React has finished rendering {/*ignore-errors-after-react-has-finished-rendering*/} If a function throws, it may be due to cancellation (e.g. the Database connection has been closed). You can use the `aborted` property to check if the error was due to cancellation or a real error. You may want to ignore errors that were due to cancellation. ```js [[1, 2, "./database"], [2, 8, "cacheSignal()?.aborted"], [3, 12, "return null"]] import {cacheSignal} from "react"; import {queryDatabase, logError} from "./database"; async function getData(id) { try { return await queryDatabase(id); } catch (x) { if (!cacheSignal()?.aborted) { // only log if it's a real error and not due to cancellation logError(x); } return null; } } async function Component({id}) { const data = await getData(id); if (data === null) { return
No data available
; } return
{data.name}
; } ``` --- ## Sitemap [Overview of all docs pages](/llms.txt)