我知道异步方法应该是非阻塞的。但我通常会看到它们与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文件,这会在某个时候阻塞我的主线程吗?我的意思是,即使它在运行之前等待调用堆栈为空,它在处理一些大文件时是否也会阻塞我的主线程?在这种情况下如何运作?
无论答案是什么,它是否适用于运行异步操作并最终被浏览器处理的任何方法?
答案 0 :(得分:1)
是的,它是“异步”。
数据硬盘驱动器/内存访问等将并行完成,这通常需要更长的时间,为此,浏览器不需要阻塞主线程,这是基本的I / O操作。
实际reading and processing of the binary data到您要求的任何格式都必须完成in parallel。
要并行运行步骤,则意味着这些步骤要与标准中的其他逻辑同时(例如,与事件循环同时)一个接一个地运行。该标准未定义实现此目标的精确机制,无论是分时协作多任务,光纤,线程,进程,使用不同的超线程,内核,CPU,机器等。相反,该操作将立即运行必须中断当前正在运行的任务,自行运行,然后继续先前运行的任务。
当然,由于硬件可能不支持并发,因此我们不能确定它是真正的并行性,但是从规范的角度来看,它是异步的。
现在,读取100GB的文件肯定会引发错误,指出您没有足够的可用内存。而且如果您确实有足够的内存,那么计算机仍然有可能遭受如此大数据的困扰。
同样,通过 .result 属性发送回线程时,生成的数据将占用内存。处理太大的数据可能会影响页面的性能。