javascript 包含具有上载进度事件处理程序的xhr对象的Web工作器

a6b3iqyw  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(92)

我试图创建一个工人,上传文件附加事件处理程序,将更新我的html页面中的进度条。上传工作已经很好。
我知道web worker无法访问DOM对象,而DOM对象是我所有进度条所在的位置。所以,我想知道是否有解决办法?我想在worker中进行上传,但我也想进行进度跟踪。我将并行上传几个文件,所以,每个工人(上传)将有自己的进度条。这是可行的吗?或者我应该放弃网络工人完全选择不同的设计?
这是我工人体内的东西

onmessage = e => {
        var xhr = new XMLHttpRequest();
        xhr.addEventListener('progress', function(e) {
            var done = e.position || e.loaded, total = e.totalSize || e.total;
            console.log('xhr progress: ' + (Math.floor(done/total*1000)/10) + '%');
        }, false);
        if ( xhr.upload ) {
            xhr.upload.onprogress = function(e) {
                var done = e.position || e.loaded, total = e.totalSize || e.total;
                console.log('xhr.upload progress: ' + done + ' / ' + total + ' = ' + (Math.floor(done/total*1000)/10) + '%');
            };
        }
        xhr.onreadystatechange = function(e) {
            if ( 4 == this.readyState ) {
                console.log(['xhr upload complete', e]);
            }
        };
        xhr.open('post', url, true);
        xhr.setRequestHeader("Content-Type","multipart/form-data");
        let formData = new FormData();
        formData.append("thefile", e.data.payload);
        xhr.send(formData)
}

我已经准备了一些事件处理程序,但目前,它只是日志。
谢谢

ffscu2ro

ffscu2ro1#

onmessage事件包含一个.source属性。这是您将数据发送回客户端的方式。在您的progress事件侦听器中,您可以添加如下内容:

e.source.postMessage({uploadName: <unique name>, progress: done});

不过要注意,您使用e作为onmessage处理程序数据和progress事件处理程序,我建议使这两个处理程序的名称唯一。
然后在你的页面中你会听到这样的信息:

window.addEventListener('message', (data) => {
  // ... read data.progress and send it to the right place on the page
}

相关问题