2014-10-19 225 views
0

当发送带有async = false的XMLHttpRequest时,xhr.upload.onprogress事件永远不会被执行文件上传。XMLHttpRequest onprogress不会触发async = false

来源:

var form = new FormData(); 
form.append("name", files[i].name); 
form.append("size", files[i].size); 
form.append("type", files[i].type); 
form.append("image", files[i]); 

var xhr = new XMLHttpRequest(); 

xhr.upload.onprogress = function(evt){ 
    alert("Progress event fired!"); 
    if (evt.lengthComputable) 
    { 
     var percentComplete = (evt.loaded/evt.total)*100; 
     console.log(percentComplete); 
    } 
}; 

xhr.onload = function() { 
    console.log(files[i].name + " uploaded!"); 
}; 

xhr.open("post", "/images/upload", false); 
xhr.send(form); 

我已经在Firefox和Chrome浏览器测试这一点。

我不知道如果我错过了一些文档,但找不到任何指示xhr.upload.onprogress事件在async = false时未被触发的情况。

如果我更改请求以async = true运行,它会被解雇。

+0

在[规范第4.5.6节](https://xhr.spec.whatwg.org/)中,您可以阅读规范中关于进度事件的内容。 – jfriend00 2014-10-19 10:14:55

+0

有关同步HTTP请求的第一条规则:您不使用它们。永远。 *自从*。 – Tomalak 2014-10-19 11:26:28

回答

1

基本上你应该而不是使用同步请求,尤其是在文件上传中,这可能需要一些时间。

使用同步请求,你块线程执行,直到一切都做(文件上传),而且即使onprogress事件将已经被解雇,你不能更新任何进度条,因为UI和所有其他处理(但文件上传)将被阻止。

这些事件是为了处理异步请求而创建的。

如果您阅读here,您会发现某些浏览器版本中已经废弃同步请求。