2014-10-19 69 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,您會發現某些瀏覽器版本中已經廢棄同步請求。