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

时间:2019-06-10 07:43:23

标签: javascript browser 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文件,这会在某个时候阻塞我的主线程吗?我的意思是,即使它在运行之前等待调用堆栈为空,它在处理一些大文件时是否也会阻塞我的主线程?在这种情况下如何运作?

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

1 个答案:

答案 0 :(得分:1)

是的,它是“异步”。

数据硬盘驱动器/内存访问等将并行完成,这通常需要更长的时间,为此,浏览器不需要阻塞主线程,这是基本的I / O操作。

实际reading and processing of the binary data到您要求的任何格式都必须完成in parallel

  

要并行运行步骤,则意味着这些步骤要与标准中的其他逻辑同时(例如,与事件循环同时)一个接一个地运行。该标准未定义实现此目标的精确机制,无论是分时协作多任务,光纤,线程,进程,使用不同的超线程,内核,CPU,机器等。相反,该操作将立即运行必须中断当前正在运行的任务,自行运行,然后继续先前运行的任务。

当然,由于硬件可能不支持并发,因此我们不能确定它是真正的并行性,但是从规范的角度来看,它是异步的。

现在,读取100GB的文件肯定会引发错误,指出您没有足够的可用内存。而且如果您确实有足够的内存,那么计算机仍然有可能遭受如此大数据的困扰。
同样,通过 .result 属性发送回线程时,生成的数据将占用内存。处理太大的数据可能会影响页面的性能。