FileReader 异步读取方法是否会阻塞主线程?

我知道异步方法应该是非阻塞的。但我通常看到它们应用于外部操作,如fetch(). 即:在浏览器之外处理的东西。


但是FileReader()API 呢?文件处理由浏览器完成,对吗?


const reader = new FileReader();


reader.onload = (event) => {

  console.log(event.target.result);

};


reader.onerror = (event) => {

  console.log(event.target.result);

};



// **ONE** OF THE POSSIBLE METHODS BELOW


reader.readAsText(file);

reader.readAsArrayBuffer(file);

reader.readAsBinaryString(file);

reader.readAsDataURL(file);


问题


如果我读取一个 100Gb 的文件,它会在某个时候阻塞我的主线程吗?我的意思是,即使它在运行之前等待调用堆栈为空,每当它处理一些大文件时,它会阻塞我的主线程吗?在这种情况下它是如何工作的?


不管答案是什么,它是否适用于运行最终由浏览器处理的异步操作的任何方法?


跃然一笑
浏览 259回答 1
1回答

狐的传说

是的,它是“异步的”。数据硬盘/内存访问等将并行完成,这通常需要更长的时间,为此浏览器不需要阻塞主线程,这是基本的I/O操作。二进制数据的实际读取和处理为您要求的任何格式必须并行完成。并行运行步骤意味着这些步骤将一个接一个地与标准中的其他逻辑同时运行(例如,与事件循环同时运行)。该标准没有定义实现这一点的精确机制,无论是分时协作多任务、纤程、线程、进程,使用不同的超线程、内核、CPU、机器等。相比之下,立即运行的操作必须中断当前正在运行的任务,运行自己,然后恢复之前运行的任务。当然,我们不能确定它是真正的并行,因为硬件可能不支持并发,但从规范的角度来看,它是异步的。现在,读取一个 100GB 的文件肯定会抛出一个错误,指出您没有足够的可用内存。如果您确实有足够的内存,那么您的计算机很可能会受到如此大量数据的影响。同样,生成的数据通过.result属性发送回线程时也会占用内存。处理太大的数据可能会影响页面的性能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript