核心是边接收边解析JSON流,绕过response.json()全量方法;通过ReadableStream逐块读取、TextDecoder流式解码、partial-json-parser-js渐进解析,并用AbortController和try/catch保障健壮性。

核心是不等全部下载完,而是接收一块、解码一块、解析一块。关键在于绕过 response.json() 这类全量方法,直接操作底层二进制流,并用能容忍不完整输入的解析逻辑处理中间态 JSON。
确认响应可用并获取流读取器
发起 fetch 后,先检查基础状态,再提取可读流:
- 确保
response.ok === true且response.status在 200–299 范围内 - 确认
response.body存在且为ReadableStream实例(部分重定向或空响应会返回null) - 调用
response.body.getReader()获取读取器,不要提前调用text()或json()
逐块读取并累积缓冲区
使用 while(true) 循环持续调用 reader.read(),把原始 Uint8Array 块逐步拼入字符串缓冲区:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 用
new TextDecoder('utf-8', { stream: true })解码,stream: true可自动缓存截断的多字节字符(如中文末尾半个 UTF-8 编码) - 每次
decoder.decode(chunk)返回的是字符串片段,追加到全局buffer字符串中 - 当
done === true时跳出循环,最后再对剩余buffer做一次终态解析
用部分 JSON 解析器处理不完整结构
标准 JSON.parse() 遇到半截对象就会报错,必须换用支持“渐进式解析”的方案:
- 识别常见 JSON 流格式:如 NDJSON(每行一个 JSON)、JSON Lines、或纯 JSON 对象流(如
{"a":1,"b":+2}) - 对 NDJSON,按
\n分割后逐行JSON.parse(),失败则跳过该行 - 对连续 JSON,使用 partial-json-parser-js 等库,它能在
{"name":"Alice","age":30这种未闭合状态下返回已解析字段 - 解析成功后立即渲染或写入文件,不等待整个响应结束
健壮性保障:取消、错误与清理
流式处理容易受网络中断、用户取消、解析异常影响,需主动兜底:
- 用
AbortController控制请求生命周期,调用abort()可同时中断 fetch 和 reader - 所有
reader.read()调用都包裹try/catch,捕获TypeError(如流被取消)或DOMException - 在
finally或catch中显式调用reader.cancel(),释放流资源 - 对解析失败的 buffer 片段,记录位置并继续尝试后续内容,避免单点错误阻塞整条流

















