闭包通过封装文件状态、提供校验接口、结合本地缓存及服务端校验,实现分片上传进度的原子化控制:状态隔离、更新互斥、断点可续、最终一致。

闭包本身不直接“实现原子化”,但它能天然封装状态、隔离作用域,是构建轻量级、线程安全(在单线程 JS 环境下)上传状态追踪器的理想工具。所谓“原子化控制”,在这里指:对分片上传进度的读写操作不可分割、不被干扰,同一 file_id 的状态更新互斥且自洽——而闭包配合不可变数据结构或同步更新逻辑,就能低成本达成这一效果。
用闭包封装独立文件的状态空间
每个文件上传任务启动时,创建一个专属闭包,把 file_id、已成功上传的分片序号列表、总分片数、是否合并完成等关键状态私有化存储,外部无法直接修改:
- 避免全局变量污染或跨文件状态误覆盖
- 多个文件同时上传时,各自状态完全隔离,天然“互斥”
- 状态变更仅通过闭包暴露的有限方法(如 markUploaded、isComplete)触发,确保逻辑集中可控
提供不可重入的原子更新接口
闭包内部不暴露原始状态对象,而是导出带校验逻辑的方法。例如:
- markUploaded(chunkIndex):只在 chunkIndex 合法且未记录时才追加,返回布尔值表示是否真正更新
- getPendingList():返回当前缺失分片的只读数组(新拷贝),不暴露内部 mutable 数组
- tryMerge():仅当 received.length === totalChunks 时才允许触发合并,并自动置为 locked 状态防止重复调用
结合本地缓存实现断点感知
闭包可内嵌 localStorage 或 IndexedDB 的轻量读写逻辑,把状态持久化到客户端:
- 初始化时从 localStorage 读取该 file_id 对应的 JSON 字符串并解析为状态快照
- 每次成功上传后,自动序列化并保存最新状态(如
{"file_id":"abc","uploaded":[0,1,3],"total":5}) - 用户刷新页面后,新建闭包仍能恢复上次进度,无需服务端查询——这就是“客户端原子状态”的落地体现
与服务端状态做最终一致性校验
闭包管理的是客户端视角的“乐观进度”,它不替代服务端校验,而是协同工作:
- 上传前调用 checkServerStatus(file_id)(由闭包发起 fetch),获取服务端已存分片列表
- 将服务端结果与本地状态 merge,生成真正需要上传的 pending 列表
- 合并请求发出后,闭包标记为 “merging”,禁用所有写操作,直到收到成功响应才转为 “done”










