Skip to main content
Version: Next 🚧

waitForFragmentData

danger

waitForFragmentData is still an experimental API. It currently has some limitations and may evolve slightly during this phase.

waitForFragmentData​

In some cases it can be useful to define data that you wish to read using a GraphQL fragment, but then consume it just once outside of React render function. waitForFragmentData allows you to wait for the data of a fragment to be avalaible,

To read a fragment's data as it changes over time, see observeFragment.

Example: Deferring data used in an event handler​

One use case for waitForFragmentData is to defer fetching data that is needed inside an event handler, but is not needed to render the initial view.

import { useCallback } from "react";
import { useFragment } from "react-relay";
import { graphql } from "relay-runtime";
import { waitForFragmentData } from "relay-runtime/experimental";

function MyComponent({ key }) {
const user = useFragment(
graphql`
fragment UserFragment on User {
name
# Page load can complete before this data has streamed in from the server.
...EventHandlerFragment @defer
}
`,
key,
);

const onClick = useCallback(async () => {
// Once the user clicks, we may need to wait for the data to finish loading.
const userData = await waitForFragmentData(
graphql`
fragment EventHandlerFragment on User {
age
}
`,
user,
);

if (userData.age < 10) {
alert("Hello kiddo!");
} else if (userData.age < 18) {
alert("Hello young person!");
} else {
alert("Hello adult person!");
}
}, [user]);

return (
<div>
My name is {user.name}
<button onClick={onClick}>Greet</button>
</div>
);
}

Arguments​

  • environment: IEnvironment. A Relay environment.
  • fragment: GraphQL fragment specified using a graphql template literal.
  • fragmentReference: The fragment reference is an opaque Relay object that Relay uses to read the data for the fragment from the store; more specifically, it contains information about which particular object instance the data should be read from.
    • The type of the fragment reference can be imported from the generated Flow types, from the file <fragment_name>.graphql.js, and can be used to declare the type of your Props. The name of the fragment reference type will be: <fragment_name>$key. We use our lint rule to enforce that the type of the fragment reference prop is correctly declared.

Return Value​

  • A Promise<T> where T is the data defined in the fragment.

The Promise will wait for all network data to become avaliable as well as any @live Relay Resolver to be in a non-suspended state before it resolves.

In the case of a network error, or a field-level error due to @throwOnFieldError or @required(action: THROW), the Promise will reject with an error.


Is this page useful?

Help us make the site even better by answering a few quick questions.