В своем блоге Слава Князев поэтапно создал хук useFetch для демонстрации того, как работает Suspense. Также автор показал, как сделать кэширование запросов, чтобы избежать частых запросов и рассинхрона данных.
В результате получился хук, который работает с Suspense и ErrorBoundary: если запрос находится в статусе pending, то покажется fallback Suspense, а если в запросе произойдет ошибка, то покажется fallback ErrorBoundary.
const useFetch = (url) => {
const { fetchUrl } = useContext(fetchCacheContext)
const promise = fetchUrl(url)
const state = readPromiseState(promise)
// Throw pending promise
const isPending = state.status === "pending"
if (isPending) throw promise
// Throw rejection reason
const error = state.reason
if (error) throw error
const data = state.value
// Allow refreshing data
const reload = () => fetchUrl(url, true)
// Only return data now
return [data, reload]
}
https://www.bbss.dev/posts/react-learn-suspense/