Generator 是 JavaScript 中天然支持暂停与恢复执行的函数机制,适合构建可中断、可查询、可续传的上传控制流;它通过 yield 切片化流程,结合 localStorage 持久化进度,支持断点续传、暂停恢复及秒传融合。

Generator 是 JavaScript 中天然支持暂停与恢复执行的函数机制,非常适合构建可中断、可查询、可续传的上传控制流。它不依赖外部状态管理库,而是通过 yield 将上传流程“切片化”为可枚举的步骤,让断点续传逻辑从“被动响应”转为“主动编排”。
用 Generator 管理分片上传生命周期
每个文件上传可抽象为一个 Generator 函数,每调用一次 next() 对应一个分片的完整上传动作(含校验、请求、错误重试)。
- 上传前 yield 检查服务端已接收分片列表,跳过已存在 chunk
- 每个分片上传 yield 返回 { status: 'uploading', chunkIndex, progress },便于 UI 更新
- 上传失败时 yield { status: 'error', chunkIndex, retryCount },由外层决定是否重试或中断
- 所有分片成功后 yield { status: 'merged', fileId },触发后端合并
结合 localStorage 实现断点状态持久化
Generator 本身不保存状态,需配合客户端存储记录执行进度:
- 每次成功上传一个分片后,将
chunkIndex写入localStorage或 IndexedDB - 重启上传时,先读取已存分片索引,再调用
generator.next()跳过已传部分 - 示例键名:
upload_state_${fileMd5}_chunks,值为 JSON 数组如[0,1,2,4]
暂停/恢复靠 next() 与 return() 协同控制
暂停不是销毁 Generator,而是暂存其迭代器引用;恢复即继续调用 next():
- 点击暂停 → 调用
iterator.return()清理当前分片请求(如 abort fetch) - 点击继续 → 重建未完成分片的请求,并调用
iterator.next()推进到下一环节 - 若需彻底中断并释放资源,可丢弃迭代器引用,下次新建 Generator 实例
与秒传逻辑自然融合
Generator 流程可在最前端插入指纹校验环节:
- 首步 yield 计算文件 MD5(使用 SparkMD5 分片计算,避免阻塞主线程)
- 拿到 MD5 后 yield 发起秒传检查请求:
POST /api/upload/check?md5=xxx - 若服务端返回已存在,则直接 yield { status: 'success', url: 'xxx' },跳过全部分片逻辑
- 整个判断嵌套在 Generator 内部,对外仍保持统一的迭代接口










