--- title: Await new: true --- ## `` Used to render [deferred][defer] values with automatic error handling. Make sure to review the [Deferred Data Guide][deferred guide] since there are a few APIs that work together with this component. ```jsx lines=[1,10-18] import { Await, useLoaderData } from "react-router-dom"; function Book() { const { book, reviews } = useLoaderData(); return (

{book.title}

{book.description}

}> Could not load reviews 😬
} children={(resolvedReviews) => ( )} /> ); } ``` **Note:** `` expects to be rendered inside of a `` or `` parent to enable the fallback UI. ## Type declaration ```tsx declare function Await( props: AwaitProps ): React.ReactElement; interface AwaitProps { children: React.ReactNode | AwaitResolveRenderFunction; errorElement?: React.ReactNode; resolve: TrackedPromise | any; } interface AwaitResolveRenderFunction { (data: Awaited): React.ReactElement; } ``` ## `children` Can either be React elements or a function. When using a function, the value is provided as the only parameter. ```tsx [2] {(resolvedReviews) => } ``` When using React elements, [`useAsyncValue`][useasyncvalue] will provide the data: ```tsx [2] ; function Reviews() { const resolvedReviews = useAsyncValue(); return
{/* ... */}
; } ``` ## `errorElement` The error element renders instead of the children when the promise rejects. You can access the error with [`useAsyncError`][useasyncerror]. If the promise rejects, you can provide an optional `errorElement` to handle that error in a contextual UI via the `useAsyncError` hook. ```tsx [3,9] } > ; function ReviewsError() { const error = useAsyncError(); return
{error.message}
; } ``` If you do not provide an errorElement, the rejected value will bubble up to the nearest route-level [`errorElement`][routeerrorelement] and be accessible via the [`useRouteError`][userouteerror] hook. ## `resolve` Takes a promise returned from a [deferred][defer] [loader][loader] value to be resolved and rendered. ```jsx [12,15,24,32-33] import { defer, Route, useLoaderData, Await, } from "react-router-dom"; // given this route { let book = await getBook(); let reviews = getReviews(); // not awaited return defer({ book, reviews, // this is a promise }); }} element={} />; function Book() { const { book, reviews, // this is the same promise } = useLoaderData(); return (

{book.title}

{book.description}

}>
); } ``` [useloaderdata]: ../hooks/use-loader-data [userouteerror]: ../hooks/use-route-error [defer]: ../utils/defer [deferred guide]: ../guides/deferred [useasyncvalue]: ../hooks/use-async-value [useasyncerror]: ../hooks/use-async-error [routeerrorelement]: ../route/error-element [loader]: ../route/loader