Из документов
Границы ошибок делают не ловить ошибки для:
- Обработчики событий (узнать больше)
- Асинхронный код (например, обратные вызовы setTimeout или requestAnimationFrame)
- Рендеринг на стороне сервера
- Ошибки, возникающие на самой границе ошибки (а не ее дочерних элементах)
Обещания асинхронны, поэтому отклоненные Обещания не будут обнаружены границами ошибок. На данный момент рекомендуемый, но несколько хакерский sh подход состоит в том, чтобы выбросить ошибку в setState
. В функциональных компонентах вы можете использовать функцию set, возвращаемую хуком useState
вместо setState
:
const [, setState] = useState()
useEffect(() => {
client.query({ query })
.then(res => setData(res))
.catch(err => {
console.warn("Error:", err);
setState(() => {
throw err;
});
});
}, []);
Бросок внутрь useEffect
также будет работать, но не внутри then
или catch
обратный вызов обещания. Вы также не можете сделать обратный вызов useEffect
функцией async
, потому что он не может вернуть Обещание. Таким образом, мы застряли с использованием setState
.
Также обратите внимание, что на самом деле нет никаких оснований для непосредственного вызова client.query
, особенно потому, что этот код не восстановит ваш пользовательский интерфейс, если изменения кеша. Вы должны использовать useQuery
и состояние data
, уже открытое для вас.