fetch api 结合 readablestream 可边接收边处理大文件响应,避免内存溢出;需检查 response.ok、body 是否存在,用 getreader() 循环读取 uint8array 块,配合 textdecoder({stream: true}) 流式解码并缓冲分块,按行或结构分隔符处理,同时捕获错误、支持取消与资源释放。

Fetch API 结合 ReadableStream 可以边接收、边处理大文件响应,避免一次性加载全部内容到内存,特别适合日志查看、长文本渲染、大 CSV 解析或实时流式数据消费等场景。关键不是调用 response.text() 或 response.blob(),而是直接操作 response.body 流。
发起请求并安全获取可读流
先确保请求成功且响应体可用:
- 检查
response.ok和response.status,HTTP 错误(如 404、500)不会自动 reject,需手动拦截 - 确认
response.body不为null(重定向、空响应或某些服务端配置可能导致无 body) - 若需预估进度,可读取
response.headers.get('content-length'),但分块传输(chunked encoding)下该值常为空 - 服务端建议返回
Content-Type: text/plain或text/event-stream,并禁用 gzip(或依赖浏览器自动解压,现代浏览器默认支持)
用 getReader() 循环读取二进制块
response.body 是一个 ReadableStream,需通过 getReader() 获取读取器:
- 调用
const reader = response.body.getReader(),返回ReadableStreamDefaultReader -
reader.read()返回 Promise,resolve 结果形如{ done: boolean, value: Uint8Array } -
value是原始字节块,done === true表示流已结束,应终止循环 - 推荐用
while (true)+await reader.read(),避免递归过深或阻塞主线程
流式解码与缓冲处理 UTF-8 截断
二进制块需转为字符串,但 UTF-8 多字节字符可能被切在块边界:
- 创建
const decoder = new TextDecoder('utf-8'),显式指定编码更可靠 - 每次调用
decoder.decode(chunk, { stream: true }),stream: true会保留未完成的多字节序列供下次拼接 - 维护一个缓存字符串(如
let buffer = ''),把每次解码结果追加进去 - 按行(
\n)或按结构分隔符(如 JSON Lines 的换行、CSV 的逗号+换行)切分buffer,提取完整单元后更新 DOM 或做业务处理 - 切分后剩余未闭合的部分保留在
buffer中,等待下一块数据
错误处理与主动取消机制
网络流易受干扰,必须覆盖异常路径和用户中断场景:
- 在
reader.read()的 Promise 上用.catch()捕获网络中断、解码失败等错误 - 用户点击取消时,调用
reader.cancel()终止读取;也可配合AbortController控制整个 fetch 请求:fetch(url, { signal }) - 流结束(
done === true)或出错后,应调用reader.releaseLock()释放读取锁,避免资源泄漏 - 对结构化数据(如每行一个 JSON),可在切分后尝试
JSON.parse(line),失败则跳过或记录警告,不中断整体流程
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











