Skip to content

请求生命周期 ​

请求有两个不同的完成边界:exchange 管线可以先接受响应,而调用方尚未读完响应体。将传输策略放入拦截器,并在调用方等待结果的位置处理解码失败。

成功路径 ​

mermaid
sequenceDiagram
  autonumber
  participant Caller as 调用方
  participant Fetcher
  participant Request as 请求拦截器
  participant Native as 原生 Fetch
  participant Response as 响应拦截器
  participant Extractor as 提取器
  Caller->>Fetcher: request(options)
  Fetcher->>Fetcher: 合并默认配置并创建 exchange
  Fetcher->>Request: 按 order 升序执行
  Request->>Native: 准备请求体与 URL 后发送
  Native-->>Request: 返回 Response(响应体可能未读取)
  Request-->>Fetcher: 请求阶段完成
  Fetcher->>Response: 按 order 升序执行
  Response-->>Fetcher: 接受 exchange
  Fetcher->>Extractor: extractResult()
  Extractor-->>Caller: 返回选择的值或 Promise 拒绝

图中展示 request() 的成功路径,参与者依次为调用方、Fetcher、请求拦截器、原生 Fetch、响应拦截器和提取器。默认请求 registry 包含请求体准备、URL 解析和 Fetch 本身,原生传输位于请求阶段内部。每个 registry 按 order 升序串行执行。exchange() 执行请求、响应 registry 后返回 exchange;request() 随后调用 extractResult()。见 packages/fetcher/src/interceptorManager.ts:90、packages/fetcher/src/interceptor.ts:294 和 packages/fetcher/src/fetcher.ts:180。

入口默认返回值适用需求
exchange()拦截完成后的 exchange直接操作管线上下文
request()FetchExchange请求/响应/错误上下文
fetch()、get()、post() 及其他 HTTP 辅助方法Response状态、响应头或原生响应体读取器
显式选择 JSON 提取器的请求解析值返回数据的服务函数,由应用验证数据

默认值依据 packages/fetcher/src/requestOptions.ts:25、packages/fetcher/src/fetcher.ts:242 和 packages/fetcher/src/fetcher.ts:268。JSON 提取调用 response.json(),泛型参数不增加运行时验证。见 packages/fetcher/src/resultExtractor.ts:69 与选择结果。

恢复不会重跑验证 ​

请求或响应拦截器抛错时,管理器将错误存入 exchange 并执行错误拦截器。如果错误被清除,exchange 立即返回,不再执行响应拦截器。因此恢复拦截器应负责替代响应的有效性。剩余错误以 ExchangeError 拒绝:已为该 exchange 创建的(如 HttpStatusValidationError)原样抛出,其他错误被包装,原错误作为 cause。错误拦截器自身抛出的错误会终止错误链、替换 exchange.error,并以同样方式包装。见 packages/fetcher/src/interceptorManager.ts:204。

结果提取在这之后发生。JSON 解码或自定义提取器可以失败,且不会重新进入错误 registry。应在消费结果的代码旁处理解码失败,详见失败模型。

提取缓存属于单个 exchange ​

exchange 缓存提取值或 Promise,替换响应会清除缓存。已拒绝的提取 Promise 保留在缓存中;同步抛错不会写入缓存。这避免同一个 exchange 重复提取,但不缓存跨请求 HTTP 响应,也不进行查询去重。数据新鲜度仍由应用决定。见 packages/fetcher/src/fetchExchange.ts:224 和 packages/fetcher/src/fetchExchange.ts:278。

实现步骤见拦截器指南、拦截器参考及结果参考。失败模型说明了传输超时为何不是完整响应体或流的截止时间。

基于 Apache License 2.0 发布。