Skip to content

失败模型 ​

在操作完成的边界处理失败。收到 HTTP 响应、解码 JSON 和消费事件流是不同操作;前一阶段成功不保证下一阶段成功。

失败出现位置应用决策
网络拒绝请求拦截管线,通常包装为 ExchangeError检查底层原因,决定重放是否安全
非 2xx HTTP 状态默认状态验证以 HttpStatusValidationError 本身拒绝,它是携带 exchange 的 ExchangeError处理服务错误响应和状态;HTTP 2xx 仍需业务结果检查
JSON 或自定义提取exchange 管线之后,直接拒绝给 request() 调用方在消费结果处捕获,并验证使用的字段
错误拦截器自身抛错从错误处理直接传播不假设所有拒绝都是 ExchangeError
SSE 读取/转换失败异步迭代流期间处理部分输出并释放 reader

默认状态验证见 packages/fetcher/src/validateStatusInterceptor.ts:169;包装、原样抛出与恢复见 packages/fetcher/src/interceptorManager.ts:204;提取见 packages/fetcher/src/fetcher.ts:246 和 packages/fetcher/src/resultExtractor.ts:69。状态失败直接满足 instanceof HttpStatusValidationError。超时或网络失败会被包装,仅在外层检查 instanceof FetchTimeoutError 会遗漏;应检查 ExchangeError 的 cause,见失败指南和错误参考。

超时与取消是不同控制 ​

请求选项传输行为谁管理截止时间
提供 signal 或 abortController,开启超时库把它们与 timer 组合,先触发者取消 FetchFetch 结束后库清理 timer;timer 从不取消调用方的 controller
两者都未提供,开启超时库用自己的 timer 取消 Fetch库清理 timer;不写入请求对象
关闭超时原生 Fetch,若提供 signal 或 abortController 则由它们取消调用方

组合实现见 packages/fetcher/src/timeout.ts:184。timer 在 Fetch 竞争结束时清除,不等待后续 response.json() 或整个 SSE 流完成。超时以 FetchTimeoutError 拒绝;调用方取消以调用方的 abort reason 拒绝。需要完整操作截止时间时,应自行管理 signal 和完整消费生命周期。步骤见取消指南。

取消不会回滚服务端已接收的写操作。超时或丢失响应后重试前,应依据端点的幂等与结果核对契约。

Hook 改变错误到达组件的方式 ​

useExecutePromise 把错误存入状态,execute() 从不拒绝:它解析为执行结束时的状态(success、error,取消时为 idle),因此调用方按 status 分支而不是捕获异常。名为 AbortError 的错误(例如来自你自己的 signal)回到空闲状态。onSuccess/onError 只对当前执行调用;回调抛错通过 console.error 报告,不改变状态。新执行、abort()、reset() 和卸载会中止执行的 controller,但普通 Promise 必须配合 controller 才能停止工作。useFetcher 还会从 ExchangeError 暴露失败请求的 exchange,例如用于读取 404 状态。见 packages/react/src/core/useExecutePromise.ts:107 与 React 请求指南。

流与认证各有具体恢复契约 ​

SSE JSON 转换调用 JSON.parse,未处理的转换错误成为流错误,读取失败在迭代时传播。提前 return 或 break 会取消 reader 并释放锁;正常结束也释放锁。初始 exchange 成功不代表剩余流成功;没有自动重连、去重或 exactly-once 投递保证。见 packages/eventstream/src/jsonServerSentEventTransformStream.ts:80、packages/eventstream/src/safeTransformer.ts:58、packages/eventstream/src/readableStreamAsyncIterable.ts:102 和 SSE 消费参考。

核心默认管线不提供通用重试策略。CoSec 的有限次数 401 刷新路径检查自身授权头及 token 会话,刷新后重放原 exchange。这是认证协议,不是任意错误重试。请求体可重放性、写幂等与服务端结果仍由应用负责。刷新失败仅在刷新端点拒绝 refresh token(返回 4xx,或响应不是 composite token)时结束会话:删除 token,RefreshTokenError 交给 onUnauthorized。网络错误、超时、中止或 5xx 保留会话并以 RefreshUnavailableError 拒绝,不会让用户退出登录;之后的请求会再次刷新(packages/cosec/src/jwtTokenManager.ts:54)。见 packages/cosec/src/authorizationResponseInterceptor.ts:80、CoSec 指南和 token 刷新参考。

基于 Apache License 2.0 发布。