为何调用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
相关产品推荐
相关产品推荐

