[Fiber] Deprecate "Throw a Promise" technique
"throw a Promise" для приостановки рендера (suspense) в React депрекейтиться — на смену приходит React.use(promise). Он безопаснее, проще для анализа и лучше работает с инструментами разработчика. Выкидывать промис можно было где угодно, что мешало React понимать, какие данные реально участвуют в рендере, ломало оптимизации и затрудняло отладку. use() делает всё явным: его нельзя использовать вне компонентов, нельзя случайно поймать через try/catch, и в будущем он позволит работать даже с обычными async-функциями без дополнительного кэширования.
В ишью есть еще ссылка на другое ишью связанное с использованием use() в условиях. Напомню, use() можно вызывать в условиях для промисов и контекста.
Так вот, теперь нельзя вызывать use() только условно, если данных нет в кэше. Это нужно, чтобы React мог правильно отследить зависимости, сохранить порядок вызовов хуков и избежать потери данных при ререндере.
При неправильном использовании (например, if (!cache.value) use(cache.promise)) React не может восстановить позицию use() в дереве вызовов — это может привести к тому, что один use() получит результат от другого промиса. Это особенно критично при серверном рендеринге (SSR) и при возобновлении Suspense — вместо «мягкого» продолжения рендера React будет полностью перерендеривать дерево или даже ломать гидрацию.
React умеет обрабатывать синхронно зарезолвленные или зареджекченные промисы, если они помечены как status = 'fulfilled' или 'rejected' и поэтому стоит использовать use(promise) даже если значение уже есть