You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用URL.revokeObjectURL方法需设置40秒延迟?

FileSaver.js中URL.revokeObjectURL延迟调用的原因解析

先看这段源码:

a.href = URL.createObjectURL(blob)
setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s
setTimeout(function () { click(a) }, 0)

为什么不能在createObjectURL后立即调用revokeObjectURL?

URL.createObjectURL(blob)生成的是一个指向内存中Blob对象的临时URL。如果立即调用revokeObjectURL,这个URL对应的内存引用会被直接释放,Blob数据会被浏览器垃圾回收。而代码里的click(a)是通过0延迟定时器触发的异步操作,当浏览器执行这个点击下载的动作时,原本的URL已经失效,找不到对应的Blob数据,下载就会直接失败。

为什么要设置40秒的延迟?

这是为了给浏览器足够的时间完成整个下载流程。不同浏览器的下载处理速度、文件大小、网络环境都会影响下载完成的时间,40秒是一个兼顾兼容性和内存占用的合理阈值:

  • 既能覆盖绝大多数场景下的下载时长,避免因为引用过早被释放导致下载中断;
  • 又不会让Blob引用长时间占用内存,防止内存泄漏的问题。

内容的提问来源于stack exchange,提问作者Lin Du

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:10:54