Endpoint 错误策略
Endpoint.errorPolicy 控制获取被拒绝(reject)时的缓存行为。它根据拒绝时的错误来判断应将其视为“软”(soft)错误还是“硬”(hard)错误。
软错误
软错误发生时,如果存在有效数据,会继续显示这些数据。但如果 store 中没有之前的数据,则会以 error 拒绝。这种情况下,useSuspense() 会抛出该错误,由最近的 ErrorBoundary 或 AsyncBoundary 捕获
硬错误
硬错误总是以 error 拒绝——即使之前已经有可用的数据。
'hard' | undefined 都可以用来表示这种状态。
软错误会继续显示上一次的数据。硬错误(以及没有数据可显示的软错误)不会被捕获,因此预览会显示这些错误,并提供 Reset preview 按钮以便重新开始。
Fixtures
GET /api/currentTime/:id
▶api/lastUpdated
▶TimePage
import { useSuspense } from '@data-client/react'; import { lastUpdated } from './api/lastUpdated'; export default function TimePage({ id }) { const { updatedAt } = useSuspense(lastUpdated, { id }); return ( <div> API time:{' '} <time> {updatedAt.toLocaleString('en-US', { timeStyle: 'long' })} </time> </div> ); }
▶ShowTime
结果
Store▶
RestEndpoint 的策略
由于 500 表示服务器故障,如果存在过时数据,我们希望继续使用它。另一方面,像 4xx 这样的状态码表示“用户错误”,也就是说这个错误反映了应用流程上的某种情况——例如记录被删除,从而返回
404。此时继续保留该记录是不准确的。
由于这是 REST API 的典型行为,它也是 @data-client/rest 的默认策略
errorPolicy(error) {
return error.status >= 500 ? 'soft' : undefined;
}
undefined 是指定硬错误的另一种方式