我正在使用HTML5 Files API等上传一个大的(许多GB)块二进制文件到服务器。
在很多地方,我看到迭代块上传在一个单独的Web Worker中完成,这样工作就不会发生在主浏览器线程上。
这种方法是否真的必要,虽然XMLHttpRequest#send
是默认异步的,因此无论如何都会在自己的线程中运行?或者这不是真正发生的事情,一个Web Worker是必要的吗?
基本上有什么"次优"(pusdo code):
var blob = file.slice(start, finish);
var request = new XMLHttpRequest();
request.open('POST', url);
request.onreadystatechange = function(e) {
if (request.readyState === 4) {
increment start etc
sendChunk();
}
};
request.send(blob);
非阻塞、异步请求可能意味着模拟并发的外观。为了确保并发线程并行执行,你可以使用web worker。
应该是这样的工作没有发生在主浏览器线程上。
。引用你所链接的文章:
正如预期的那样,回调与同步FileReader一起消失了。这简化了读取文件时回调嵌套的数量。相反,readAs*方法返回读取的文件。
在某些情况下,对于某些任务,同步API要干净得多。更少的回调是不错的,而且肯定会使内容更可读。
当然,启动和维护异步也需要一些工作,你可以把它加载到WebWorker中。然而,繁重的工作(读取文件,处理网络请求)总是在后台完成的。
文章还提到WebWorkers会产生一些开销。你不仅需要实例化一个Worker,还需要复制它应该使用的所有数据。